В REPL это работает:
> mm n = (\n -> n * 2) <$> n
> mm (2:3:Nil)
(4 : 6 : Nil)
в файле, который компилируется, и я могу запустить его:
squareOf ls =
map (\n -> n * n) ls
однако, когда я добавляю определение типа к этой функции
squareOf :: List Int -> Int
squareOf ls =
map (\n -> n * n) ls
Я получаю ошибку:
Could not match type
List Int
with type
Int
while checking that type t0 t1
is at least as general as type Int
while checking that expression (map (\n ->
(...) n
)
)
ls
has type Int
in value declaration squareOf
where t0 is an unknown type
t1 is an unknown type
Я попытался изменить сигнатуру на псевдоним типа в списке, а также безуспешно попробовал полное определение.
Если я проверю определение, созданное, когда я не помещаю подписи в свою функцию, я получу:
forall t2 t3. Functor t2 => Semiring t3 => t2 t3 -> t2 t3
Может кто-нибудь объяснить, почему моя подпись неверна, а также почему я получаю эту подпись для функции?
Приветствия
Редактировать: Спасибо за комментарии, обновив определение fn, чтобы оно также возвращало List Int
, и, конечно, это решает проблему