< Yet Another Haskell Tutorial < Language advanced
Sections and Infix Operators
Local Declarations
Partial Application
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
Guards
Instance Declarations
The Eq Class
The Show Class
Other Important Classes
The Ord Class
The Enum Class
The Num Class
The Read Class
Class Contexts
Deriving Classes
Datatypes Revisited
Named Fields
More Lists
Standard List Functions
List Comprehensions
Arrays
Finite Maps
Layout
The Final Word on Lists
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) []
This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.