У меня проблема с областью действия Хаскелла в определениях where
. Когда у меня есть следующая функция f
, где я хочу передать x
локально определенной функции f1
без явного использования ее в качестве параметра, я получаю сообщение о том, что тип x
несовместим с тот, что выводится f1
, хотя он должен быть таким же:
f :: Eq a => a -> [a]
f x = f1 x
where
f1 :: Eq a => a -> [a]
f1 y = [ x, y ]
Ошибка следующая:
Couldn't match expected type `a1' against inferred type `a'
`a1' is a rigid type variable bound by
the type signature for `f1' at test.hs:4:11
`a' is a rigid type variable bound by
the type signature for `f' at test.hs:1:8
In the expression: x
In the expression: [x, y]
In the definition of `f1': f1 y = [x, y]
Failed, modules loaded: none.
Однако, когда я передаю x
в качестве дополнительного параметра, как я делал в следующем коде с функцией g
, он прекрасно работает:
g :: Eq a => a -> [a]
g x = g1 x x
where
g1 :: Eq a => a -> a -> [a]
g1 x y = [ x, y ]
Есть ли способ сделать тип a
в f
совместимым с типом a
(или a1
) в f1
?