У меня проблема с областью Haskell в определениях where
. Когда у меня есть следующая функция f
, где я хочу передать x
локально определенной функции f1
, не используя ее в качестве параметра, я получаю сообщение об ошибке, что тип x
несовместим с типом f1
, хотя она должна быть такой же:Haskell просматривает определения вложенных функций, используя где
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
?
Хотя это очень хорошая практика для сахара вашего кода с сигнатурами типа лота, за исключением чрезвычайно тривиальных частей, я не вижу причин для использования в них локальных функций с сахаром. Понятно, что такое подпись типа, а для таких тривиальных функций вы теряете больше в читаемости, чем получаете. – Rayne
Ну, фактическая функция была более сложной, я просто сводил ее к простому примеру, чтобы моя фактическая проблема стала ясна. – poke