Как небольшое упражнение, я пытаюсь перекодировать все. Этот код, кажется, работает (для бесконечного списка, за исключением):foldl компилируется, но не foldr
allComp f acc x = acc && f x
all :: (a -> Bool) -> [a] -> Bool
all f xs = foldl (allComp f) True xs
Но один не компилируется, если я держу такую же подпись:
allComp f acc x = acc && f x
all :: (a -> Bool) -> [a] -> Bool
all f xs = foldr (allComp f) True xs
и ошибка компиляции:
Couldn't match type `a' with `Bool'
`a' is a rigid type variable bound by
the type signature for all :: (a -> Bool) -> [a] -> Bool
at Main.hs:8:8
Expected type: Bool -> Bool
Actual type: a -> Bool
In the first argument of `allComp', namely `f'
In the first argument of `foldr', namely `(allComp f)'
In the expression: foldr (allComp f) True xs
Может ли кто-нибудь объяснить более четко, почему первая версия компилируется, но не вторая?
Посмотрите на типовые подписи для 'foldl' и' foldr'. Подсказка: они разные. – MathematicalOrchid
Кроме того, если вы новичок в типах, вы можете войти в ghci ': t allComp', чтобы увидеть его подпись типа. – luqui