-
Notifications
You must be signed in to change notification settings - Fork 0
/
functor.hs
89 lines (58 loc) · 3.1 KB
/
functor.hs
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
module Demo where
{-
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
-}
{-
Определите представителя класса Functor для следующего типа данных, представляющего точку в трёхмерном пространстве:
data Point3D a = Point3D a a a deriving Show
GHCi> fmap (+ 1) (Point3D 5 6 7)
Point3D 6 7 8
-}
data Point3D a = Point3D a a a deriving Show
instance Functor Point3D where
fmap f (Point3D x y z) = Point3D (f x) (f y) (f z)
{-
Определите представителя класса Functor для типа данных GeomPrimitive, который определён следующим образом:
data GeomPrimitive a = Point (Point3D a) | LineSegment (Point3D a) (Point3D a)
При определении, воспользуйтесь тем, что Point3D уже является представителем класса Functor.
GHCi> fmap (+ 1) $ Point (Point3D 0 0 0)
Point (Point3D 1 1 1)
GHCi> fmap (+ 1) $ LineSegment (Point3D 0 0 0) (Point3D 1 1 1)
LineSegment (Point3D 1 1 1) (Point3D 2 2 2)
-}
data GeomPrimitive a = Point (Point3D a) | LineSegment (Point3D a) (Point3D a)
instance Functor GeomPrimitive where
fmap f (LineSegment a b) = LineSegment (fmap f a) (fmap f b)
fmap f (Point a) = Point $ fmap f a
{-
Определите представителя класса Functor для бинарного дерева, в каждом узле которого хранятся элементы типа Maybe:
data Tree a = Leaf (Maybe a) | Branch (Tree a) (Maybe a) (Tree a) deriving Show
GHCi> words <$> Leaf Nothing
Leaf Nothing
GHCi> words <$> Leaf (Just "a b")
Leaf (Just ["a","b"]
-}
data Tree a = Leaf (Maybe a) | Branch (Tree a) (Maybe a) (Tree a) deriving Show
instance Functor Tree where
fmap f (Leaf Nothing) = Leaf Nothing
fmap f (Leaf (Just a)) = Leaf (Just (f a))
fmap f (Branch l (Nothing) r) = Branch (fmap f l) Nothing (fmap f r)
fmap f (Branch l (Just a) r) = Branch (fmap f l) (Just (f a)) (fmap f r)
{-
Определите представителя класса Functor для типов данных Entry и Map. Тип Map представляет словарь, ключами которого являются пары:
data Entry k1 k2 v = Entry (k1, k2) v deriving Show
data Map k1 k2 v = Map [Entry k1 k2 v] deriving Show
В результате должно обеспечиваться следующее поведение: fmap применяет функцию к значениям в словаре, не изменяя при этом ключи.
GHCi> fmap (map toUpper) $ Map []
Map []
GHCi> fmap (map toUpper) $ Map [Entry (0, 0) "origin", Entry (800, 0) "right corner"]
Map [Entry (0,0) "ORIGIN",Entry (800,0) "RIGHT CORNER"]
-}
data Entry k1 k2 v = Entry (k1, k2) v deriving Show
data Map k1 k2 v = Map [Entry k1 k2 v] deriving Show
instance Functor (Entry k1 k2) where
fmap f (Entry (k1, k2) v) = Entry (k1, k2) (f v)
instance Functor (Map k1 k2) where
fmap f (Map xs) = Map (map (\i -> fmap f i) xs)