Yet Another Haskell Tutorial/Language advanced/Solutions
Appearance
Sections and Infix Operators
[edit | edit source]Local Declarations
[edit | edit source]Partial Application
[edit | edit source]Function func3
cannot be converted into point-free style. The
others look something like:
func1 x = map (*x) func2 f g = filter f . map g func4 = map (+2) . filter (`elem` [1..10]) . (5:) func5 = flip foldr 0 . flip . curry
You might have been tempted to try to write func2
as filter f
. map
, trying to eta-reduce off the g
. In this case, this isn't
possible. This is because the function composition operator (.
)
has type (b -> c) -> (a -> b) -> (a -> c)
. In this
case, we're trying to use map
as the second argument. But
map
takes two arguments, while (.)
expects a function which
takes only one.
Pattern Matching
[edit | edit source]Guards
[edit | edit source]Instance Declarations
[edit | edit source]The Eq Class
[edit | edit source]The Show Class
[edit | edit source]Other Important Classes
[edit | edit source]The Ord Class
[edit | edit source]The Enum Class
[edit | edit source]The Num Class
[edit | edit source]The Read Class
[edit | edit source]Class Contexts
[edit | edit source]Deriving Classes
[edit | edit source]Datatypes Revisited
[edit | edit source]Named Fields
[edit | edit source]More Lists
[edit | edit source]Standard List Functions
[edit | edit source]List Comprehensions
[edit | edit source]Arrays
[edit | edit source]Finite Maps
[edit | edit source]Layout
[edit | edit source]The Final Word on Lists
[edit | edit source]We can start out with a recursive definition:
and [] = True and (x:xs) = x && and xs
From here, we can clearly rewrite this as:
and = foldr (&&) True
We can write this recursively as:
concatMap f [] = [] concatMap f (x:xs) = f x ++ concatMap f xs
This hints that we can write this as:
concatMap f = foldr (\a b -> f a ++ b) []
Now, we can do point elimination to get:
foldr (\a b -> f a ++ b) [] ==> foldr (\a b -> (++) (f a) b) [] ==> foldr (\a -> (++) (f a)) [] ==> foldr (\a -> ((++) . f) a) [] ==> foldr ((++) . f) []