-
Notifications
You must be signed in to change notification settings - Fork 0
/
functors.lhs
63 lines (42 loc) · 1.22 KB
/
functors.lhs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
The theory stuff
----------------
Functor is a type class. Very much like Eq, Ord, Show, ...
It requires a type constructor that takes *one* parameter
>class Functor f where
> fmap :: (a -> b) -> f a -> f b
< fmap id = id
< fmap (g . f) = fmap g . fmap f
A functor example:
Lists
> map :: (a -> b) -> [a] -> [b]
> instance Functor [] where
> fmap = map
Further examples (select one)
Maybe
-----
> data Maybe x = Just x | Nothing
> instance Functor Maybe where
> fmap f (Just x) = Just (f x)
> fmap f Nothing = Nothing
> fmap (++ "ho") (Just "hey")
Trees
-----
> data Tree x = Empty | Node x (Tree x) (Tree x)
> instance Functor Tree where
> fmap f Empty = Empty
> fmap f (Node x left right) = Node (f x) (fmap f left) (fmap f right)
Mapping between functors
------------------------
Alpha is a "natural transformation" - a way to map one functor to another
< alpha :: F a -> G a
alpha
F A ---------> G A
| |
| |
fmap f | | fmap f
| |
v v
F B ---------> G B
alpha
Parametricity
< alpha . fmap f = fmap f . alpha