Длина счета Хаскелла с использованием ошибки типа броска фолдера
Попытка реализовать подсчет списков через функцию foldr
lengthList = foldr (\x s -> s + 1) 0
выдает следующую ошибку
* Ambiguous type variable `t0' arising from a use of `foldr'
prevents the constraint `(Foldable t0)' from being solved.
Relevant bindings include
lengthList :: t0 a -> Integer (bound at lenListFoldr.hs:2:1)
Probable fix: use a type annotation to specify what `t0' should be.
These potential instances exist:
instance Foldable (Either a) -- Defined in `Data.Foldable'
instance Foldable Maybe -- Defined in `Data.Foldable'
instance Foldable ((,) a) -- Defined in `Data.Foldable'
...plus one other
...plus 23 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
* In the expression: foldr (\ x s -> s + 1) 0
In an equation for `lengthList':
lengthList = foldr (\ x s -> s + 1) 0
Как я могу это исправить?
2 ответа
Это может быть решено определением типа:
lengthList :: (Foldable t, Num a1) => t a2 -> a1
Это странно, но если просто вставить функцию в интерпретатор, она будет работать нормально без определения типа
Добавить тип подписи:
lengthList :: [a] -> Int
Или что-то подобное. Ошибка гласит: "Вероятное исправление: используйте аннотацию типа, чтобы указать, каким должно быть t0". Другими словами, компилятор не может определить тип. Или, как говорится в комментарии: используйте функцию в контексте, тогда компилятор будет использовать контекст для определения правильного типа для lengthList
, Я верю функции foldr
использует ограничение класса Foldable t
; в вашем случае компилятор не знает что lengthList
складывается. Дав подпись выше, вы обязуетесь t0
быть списком. Посмотрите на вывод, который дает GHCi для
:t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
Короче говоря, GHC может выяснить, что a
не используется и b
это Num
, но не знает t
,