Это мое определение функции любого»Почему я получаю эту ошибку, когда пытаюсь написать определение типа локальной функции в Haskell?
any' :: (t -> Bool) -> [t] -> Bool
any' f = foldl' step False
where step :: Bool -> t -> Bool
step b x | f x = True
| otherwise = b
Я получаю эту ошибку при загрузке в объятиях:
ERROR "folds.hs":65 - Inferred type is not general enough
*** Expression : step
*** Expected type : Bool -> a -> Bool
*** Inferred type : Bool -> _7 -> Bool
... и это в GHCI:
folds.hs:65:27:
Couldn't match expected type `t' with actual type `t1'
`t' is a rigid type variable bound by
the type signature for any' :: (t -> Bool) -> [t] -> Bool
at folds.hs:62:9
`t1' is a rigid type variable bound by
the type signature for step :: Bool -> t1 -> Bool at folds.hs:64:22
In the first argument of `f', namely `x'
In the expression: f x
In a stmt of a pattern guard for
an equation for `step':
f x
Когда я удалить определение типа шага. Он отлично работает, поэтому мой вопрос ... Существует способ правильно написать это определение типа или я имею дело с одним из тех, кто сидит где локальные функции не могут быть явно введены?
Вам нужно расширение переменных типа области действия, иначе компилятор видит вторую t как новую переменную типа полиморфного типа, а не то же самое, что и в объявлении основного типа. –
Кстати, почему foldl 'и не foldr? –
Вы правы Sassa NF, foldr лучше, так как позволяет такие вещи, как «any» even (repeat 2) » – matiascelasco