Trying to learn how to use folds by redefining prelude functions:
import Prelude hiding (sum, product, length, and, or, all, any, filter)
So far I've got up to all working, but I can't figure out what I'm doing wrong with all. I'm defining it as follows:
and :: [Bool] -> Bool
and = foldr (&&) True
...
all :: (a -> Bool) -> [a] -> Bool
all = and $ map
But this displays an error saying :
Probable cause: ‘map’ is applied to too few arguments
I've also tried defining it as:
and :: [Bool] -> Bool
and = foldr (&&) True
...
all :: (a -> Bool) -> [a] -> Bool
all f [xs] = and $ map f [xs]
This compiles fine, but when I try to call it it says:
[1 of 1] Compiling Fold ( Fold.hs, interpreted )
Ok, modules loaded: Fold.
*Fold> all even [0,2,4,6]
*** Exception: Fold.hs:17:1-29: Non-exhaustive patterns in function all
which I don't understand since shouldn't [xs] match any list, even an empty one? Why can I curry foldr without including the list but not map? Any help would be appreciated.
You mixed up function application with composition. Does this help?
In practise, this is equivalent to your code + the comment from @Carcigenicate