1
+ {-# LANGUAGE InstanceSigs #-}
2
+
1
3
import Control.Monad
2
4
import Data.Char
3
5
4
6
-- =================== Functors
5
-
6
7
data Tree a = Leaf a | Node (Tree a ) (Tree a ) deriving (Show )
7
8
8
9
instance Functor Tree where
10
+ fmap :: (a -> b ) -> Tree a -> Tree b
9
11
fmap g (Leaf x) = Leaf (g x)
10
12
fmap g (Node l r) = Node (fmap g l) (fmap g r)
11
13
12
14
ex1 :: Tree Int
13
- ex1 = fmap length (Leaf " abc" )
15
+ ex1 = fmap length (Leaf " abc" ) -- Leaf 3
14
16
15
17
ex2 :: Tree Bool
16
- ex2 = fmap even (Node (Leaf 1 ) (Leaf 2 ))
18
+ ex2 = fmap even (Node (Leaf 1 ) (Leaf 2 )) -- Node (Leaf False) (Leaf True)
17
19
18
20
inc :: Functor f => f Int -> f Int
19
21
inc = fmap (+ 1 )
20
22
21
23
ex3 :: [Int ]
22
- ex3 = inc [1 , 2 , 3 , 4 , 5 ]
24
+ ex3 = inc [1 , 2 , 3 , 4 , 5 ] -- [2,3,4,5,6]
23
25
24
26
ex4 :: Maybe Int
25
- ex4 = inc (Just 1 )
27
+ ex4 = inc (Just 1 ) -- Just 2
26
28
27
29
-- =================== Applicatives
28
-
29
30
ex5 :: Maybe Integer
30
- ex5 = pure (+ 1 ) <*> Just 1
31
+ ex5 = pure (+ 1 ) <*> Just 1 -- Just 2
31
32
32
33
ex6 :: Maybe Integer
33
- ex6 = pure (+) <*> Just 1 <*> Just 2
34
+ ex6 = pure (+) <*> Just 1 <*> Just 2 -- Just 3
34
35
35
36
ex7 :: Maybe Integer
36
- ex7 = pure (+) <*> Nothing <*> Just 2
37
+ ex7 = pure (+) <*> Nothing <*> Just 2 -- Nothing
37
38
38
39
ex8 :: [Integer ]
39
- ex8 = pure (+ 1 ) <*> [1 , 2 , 3 ]
40
+ ex8 = pure (+ 1 ) <*> [1 , 2 , 3 ] -- [2,3,4]
40
41
41
42
ex9 :: [Integer ]
42
- ex9 = pure (+) <*> [1 ] <*> [2 ]
43
+ ex9 = pure (+) <*> [1 ] <*> [2 ] -- [3]
43
44
44
45
ex10 :: [Integer ]
45
- ex10 = pure (*) <*> [1 , 2 ] <*> [3 , 4 ]
46
+ ex10 = pure (*) <*> [1 , 2 ] <*> [3 , 4 ] -- [3,4,6,8]
46
47
47
48
prods :: [Int ] -> [Int ] -> [Int ]
48
- prods xs ys = [x * y | x <- xs, y <- ys]
49
+ prods xs ys = [x * y | x <- xs, y <- ys] -- [3,4,6,8]
49
50
50
51
ex11 :: [Int ]
51
- ex11 = prods [1 , 2 ] [3 , 4 ]
52
+ ex11 = prods [1 , 2 ] [3 , 4 ] -- [3,4,6,8]
52
53
53
54
prods2 :: [Int ] -> [Int ] -> [Int ]
54
55
prods2 xs ys = pure (*) <*> xs <*> ys
@@ -60,21 +61,20 @@ getChars :: Int -> IO String
60
61
getChars n = sequenceA (replicate n getChar )
61
62
62
63
ex13 :: [Int ]
63
- ex13 = (+ 1 ) <$> [1 , 2 ]
64
+ ex13 = (+ 1 ) <$> [1 , 2 ] -- [2,3]
64
65
65
66
ex14 :: [Integer ]
66
- ex14 = (*) <$> [1 , 2 , 3 ] <*> [4 , 5 , 6 ]
67
+ ex14 = (*) <$> [1 , 2 , 3 ] <*> [4 , 5 , 6 ] -- [4,5,6,8,10,12,12,15,18]
67
68
68
69
-- =================== Monads
69
-
70
70
data Expr = Val Int | Div Expr Expr
71
71
72
72
eval :: Expr -> Int
73
73
eval (Val n) = n
74
74
eval (Div x y) = eval x `div` eval y
75
75
76
76
ex15 :: Int
77
- ex15 = eval (Div (Val 1 ) (Val 0 ))
77
+ ex15 = eval (Div (Val 1 ) (Val 0 )) -- Exception: divide by zero
78
78
79
79
safediv :: Int -> Int -> Maybe Int
80
80
safediv _ 0 = Nothing
@@ -89,10 +89,10 @@ eval2 (Div x y) = case eval2 x of
89
89
Just m -> safediv n m
90
90
91
91
ex16a :: Maybe Int
92
- ex16a = eval2 (Div (Val 4 ) (Val 2 ))
92
+ ex16a = eval2 (Div (Val 4 ) (Val 2 )) -- Just 2
93
93
94
94
ex16b :: Maybe Int
95
- ex16b = eval2 (Div (Val 1 ) (Val 0 ))
95
+ ex16b = eval2 (Div (Val 1 ) (Val 0 )) -- Nothing
96
96
97
97
eval3 :: Expr -> Maybe Int
98
98
eval3 (Val n) = Just n
@@ -102,10 +102,10 @@ eval3 (Div x y) =
102
102
safediv n m
103
103
104
104
ex17a :: Maybe Int
105
- ex17a = eval3 (Div (Val 4 ) (Val 2 ))
105
+ ex17a = eval3 (Div (Val 4 ) (Val 2 )) -- Just 2
106
106
107
107
ex17b :: Maybe Int
108
- ex17b = eval3 (Div (Val 1 ) (Val 0 ))
108
+ ex17b = eval3 (Div (Val 1 ) (Val 0 )) -- Nothing
109
109
110
110
eval4 :: Expr -> Maybe Int
111
111
eval4 (Val n) = Just n
@@ -115,10 +115,10 @@ eval4 (Div x y) = do
115
115
safediv n m
116
116
117
117
ex18a :: Maybe Int
118
- ex18a = eval4 (Div (Val 4 ) (Val 2 ))
118
+ ex18a = eval4 (Div (Val 4 ) (Val 2 )) -- Just 2
119
119
120
120
ex18b :: Maybe Int
121
- ex18b = eval4 (Div (Val 1 ) (Val 0 ))
121
+ ex18b = eval4 (Div (Val 1 ) (Val 0 )) -- Nothing
122
122
123
123
pairs :: [a ] -> [b ] -> [(a , b )]
124
124
pairs xs ys = do
@@ -140,18 +140,18 @@ rlabel (Node l r) n = (Node l' r', n'')
140
140
(r', n'') = rlabel r n'
141
141
142
142
ex19 :: Tree Int
143
- ex19 = fst (rlabel tree 0 )
143
+ ex19 = fst (rlabel tree 0 ) -- Node (Node (Leaf 0) (Leaf 1)) (Leaf 2)
144
144
145
145
conv :: Char -> Maybe Int
146
146
conv c
147
147
| isDigit c = Just $ digitToInt c
148
148
| otherwise = Nothing
149
149
150
150
ex20 :: Maybe [Int ]
151
- ex20 = mapM conv " 1234"
151
+ ex20 = mapM conv " 1234" -- Just [1,2,3,4]
152
152
153
153
ex21 :: [[Integer ]]
154
- ex21 = filterM (\ x -> [True , False ]) [1 , 2 , 3 ]
154
+ ex21 = filterM (\ x -> [True , False ]) [1 , 2 , 3 ] -- [[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]]
155
155
156
156
join' :: Monad m => m (m a ) -> m a
157
157
join' mmx = do
@@ -160,13 +160,13 @@ join' mmx = do
160
160
return x
161
161
162
162
ex22 :: [Integer ]
163
- ex22 = join' [[1 , 2 ], [3 , 4 ], [5 , 6 ]]
163
+ ex22 = join' [[1 , 2 ], [3 , 4 ], [5 , 6 ]] -- [1,2,3,4,5,6]
164
164
165
165
ex23 :: Maybe Integer
166
- ex23 = join' (Just (Just 1 ))
166
+ ex23 = join' (Just (Just 1 )) -- Just 1
167
167
168
168
ex24 :: Maybe a
169
- ex24 = join' (Just Nothing )
169
+ ex24 = join' (Just Nothing ) -- Nothing
170
170
171
171
ex25 :: Maybe a
172
- ex25 = join' Nothing
172
+ ex25 = join' Nothing -- Nothing
0 commit comments