20-CS-4003-001 | Organization of Programming Languages | Fall 2017 |
---|---|---|
Types |
Functors
class Functor f where fmap :: (a -> b) -> f a -> f b instance Functor [] where fmap = map v1 = fmap (*2) [1..3] instance Functor Maybe where fmap f (Just x) = Just (f x) fmap f Nothing = Nothing v2 = fmap (*2) (Just 200) data Tree a = Empty | Node a (Tree a) (Tree a) | Leaf a deriving (Show, Read, Eq) instance Functor Tree where fmap f Empty = Empty fmap f (Leaf x) = Leaf (f x) fmap f (Node x left right) = Node (f x) (fmap f left) (fmap f right) v3 = fmap (*2) Empty treeInsert x Empty = Leaf x treeInsert x (Leaf a) | x == a = Leaf x | x < a = Node a (treeInsert x Empty) Empty | x > a = Node a Empty (treeInsert x Empty) treeInsert x (Node a left right) | x == a = Node x left right | x < a = Node a (treeInsert x left) right | x > a = Node a left (treeInsert x right) v4 = fmap (*4) (foldr treeInsert Empty [5,6,4,2,1,3]) |
- |
A functor maps a function over elements of a list. It is defined like
this:
class Functor f where fmap :: (a -> b) -> f a -> f bNote that f is not really a function but a type constructor. If it were a function there would be some concrete types that it would map over. fmap takes a function from one type to another and a functor applied with one type and returns a functor applied with another type. Maybe can be turned into a functor: instance Functor Maybe where fmap f (Just x) = Just (f x) fmap f Nothing = NothingTo the left, v1 is [2,4,6] and v2 is Just 400. Also to the left is a functor that traverses a Tree, applying a function to every Node. The example shown involves a Tree with integer Nodes and the function that is applied to each Node multiplies the Node's value by 4. |