Длина счета Хаскелла с использованием ошибки типа броска фолдера - PullRequest
0 голосов
/ 17 сентября 2018

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

0 голосов
/ 17 сентября 2018

Может быть решено определением типа:

lengthList :: (Foldable t, Num a1) => t a2 -> a1

Это странно, но если просто вставить функцию в интерпретатор, она будет работать без определения типа

0 голосов
/ 17 сентября 2018

Добавить тип подписи:

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.

...