Haskell/YAHT/Language advanced/Solutions

Sections and Infix Operators

↑Jump back a section

Local Declarations

↑Jump back a section

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.


↑Jump back a section

Pattern Matching

↑Jump back a section

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

↑Jump back a section

Datatypes Revisited

Named Fields

↑Jump back a section

More Lists

Standard List Functions

List Comprehensions

↑Jump back a section

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) []
↑Jump back a section
Last modified on 26 June 2007, at 13:28