Длина счета Хаскелла с использованием ошибки типа броска фолдера

Попытка реализовать подсчет списков через функцию 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,

Другие вопросы по тегам