Skip to content

Commit 460f2d9

Browse files
committed
Chapter 12 refactoring
1 parent b148d18 commit 460f2d9

File tree

2 files changed

+58
-51
lines changed

2 files changed

+58
-51
lines changed

src/chapter-12/examples.hs

+31-31
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,55 @@
1+
{-# LANGUAGE InstanceSigs #-}
2+
13
import Control.Monad
24
import Data.Char
35

46
-- =================== Functors
5-
67
data Tree a = Leaf a | Node (Tree a) (Tree a) deriving (Show)
78

89
instance Functor Tree where
10+
fmap :: (a -> b) -> Tree a -> Tree b
911
fmap g (Leaf x) = Leaf (g x)
1012
fmap g (Node l r) = Node (fmap g l) (fmap g r)
1113

1214
ex1 :: Tree Int
13-
ex1 = fmap length (Leaf "abc")
15+
ex1 = fmap length (Leaf "abc") -- Leaf 3
1416

1517
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)
1719

1820
inc :: Functor f => f Int -> f Int
1921
inc = fmap (+ 1)
2022

2123
ex3 :: [Int]
22-
ex3 = inc [1, 2, 3, 4, 5]
24+
ex3 = inc [1, 2, 3, 4, 5] -- [2,3,4,5,6]
2325

2426
ex4 :: Maybe Int
25-
ex4 = inc (Just 1)
27+
ex4 = inc (Just 1) -- Just 2
2628

2729
-- =================== Applicatives
28-
2930
ex5 :: Maybe Integer
30-
ex5 = pure (+ 1) <*> Just 1
31+
ex5 = pure (+ 1) <*> Just 1 -- Just 2
3132

3233
ex6 :: Maybe Integer
33-
ex6 = pure (+) <*> Just 1 <*> Just 2
34+
ex6 = pure (+) <*> Just 1 <*> Just 2 -- Just 3
3435

3536
ex7 :: Maybe Integer
36-
ex7 = pure (+) <*> Nothing <*> Just 2
37+
ex7 = pure (+) <*> Nothing <*> Just 2 -- Nothing
3738

3839
ex8 :: [Integer]
39-
ex8 = pure (+ 1) <*> [1, 2, 3]
40+
ex8 = pure (+ 1) <*> [1, 2, 3] -- [2,3,4]
4041

4142
ex9 :: [Integer]
42-
ex9 = pure (+) <*> [1] <*> [2]
43+
ex9 = pure (+) <*> [1] <*> [2] -- [3]
4344

4445
ex10 :: [Integer]
45-
ex10 = pure (*) <*> [1, 2] <*> [3, 4]
46+
ex10 = pure (*) <*> [1, 2] <*> [3, 4] -- [3,4,6,8]
4647

4748
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]
4950

5051
ex11 :: [Int]
51-
ex11 = prods [1, 2] [3, 4]
52+
ex11 = prods [1, 2] [3, 4] -- [3,4,6,8]
5253

5354
prods2 :: [Int] -> [Int] -> [Int]
5455
prods2 xs ys = pure (*) <*> xs <*> ys
@@ -60,21 +61,20 @@ getChars :: Int -> IO String
6061
getChars n = sequenceA (replicate n getChar)
6162

6263
ex13 :: [Int]
63-
ex13 = (+ 1) <$> [1, 2]
64+
ex13 = (+ 1) <$> [1, 2] -- [2,3]
6465

6566
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]
6768

6869
-- =================== Monads
69-
7070
data Expr = Val Int | Div Expr Expr
7171

7272
eval :: Expr -> Int
7373
eval (Val n) = n
7474
eval (Div x y) = eval x `div` eval y
7575

7676
ex15 :: Int
77-
ex15 = eval (Div (Val 1) (Val 0))
77+
ex15 = eval (Div (Val 1) (Val 0)) -- Exception: divide by zero
7878

7979
safediv :: Int -> Int -> Maybe Int
8080
safediv _ 0 = Nothing
@@ -89,10 +89,10 @@ eval2 (Div x y) = case eval2 x of
8989
Just m -> safediv n m
9090

9191
ex16a :: Maybe Int
92-
ex16a = eval2 (Div (Val 4) (Val 2))
92+
ex16a = eval2 (Div (Val 4) (Val 2)) -- Just 2
9393

9494
ex16b :: Maybe Int
95-
ex16b = eval2 (Div (Val 1) (Val 0))
95+
ex16b = eval2 (Div (Val 1) (Val 0)) -- Nothing
9696

9797
eval3 :: Expr -> Maybe Int
9898
eval3 (Val n) = Just n
@@ -102,10 +102,10 @@ eval3 (Div x y) =
102102
safediv n m
103103

104104
ex17a :: Maybe Int
105-
ex17a = eval3 (Div (Val 4) (Val 2))
105+
ex17a = eval3 (Div (Val 4) (Val 2)) -- Just 2
106106

107107
ex17b :: Maybe Int
108-
ex17b = eval3 (Div (Val 1) (Val 0))
108+
ex17b = eval3 (Div (Val 1) (Val 0)) -- Nothing
109109

110110
eval4 :: Expr -> Maybe Int
111111
eval4 (Val n) = Just n
@@ -115,10 +115,10 @@ eval4 (Div x y) = do
115115
safediv n m
116116

117117
ex18a :: Maybe Int
118-
ex18a = eval4 (Div (Val 4) (Val 2))
118+
ex18a = eval4 (Div (Val 4) (Val 2)) -- Just 2
119119

120120
ex18b :: Maybe Int
121-
ex18b = eval4 (Div (Val 1) (Val 0))
121+
ex18b = eval4 (Div (Val 1) (Val 0)) -- Nothing
122122

123123
pairs :: [a] -> [b] -> [(a, b)]
124124
pairs xs ys = do
@@ -140,18 +140,18 @@ rlabel (Node l r) n = (Node l' r', n'')
140140
(r', n'') = rlabel r n'
141141

142142
ex19 :: Tree Int
143-
ex19 = fst (rlabel tree 0)
143+
ex19 = fst (rlabel tree 0) -- Node (Node (Leaf 0) (Leaf 1)) (Leaf 2)
144144

145145
conv :: Char -> Maybe Int
146146
conv c
147147
| isDigit c = Just $ digitToInt c
148148
| otherwise = Nothing
149149

150150
ex20 :: Maybe [Int]
151-
ex20 = mapM conv "1234"
151+
ex20 = mapM conv "1234" -- Just [1,2,3,4]
152152

153153
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],[]]
155155

156156
join' :: Monad m => m (m a) -> m a
157157
join' mmx = do
@@ -160,13 +160,13 @@ join' mmx = do
160160
return x
161161

162162
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]
164164

165165
ex23 :: Maybe Integer
166-
ex23 = join' (Just (Just 1))
166+
ex23 = join' (Just (Just 1)) -- Just 1
167167

168168
ex24 :: Maybe a
169-
ex24 = join' (Just Nothing)
169+
ex24 = join' (Just Nothing) -- Nothing
170170

171171
ex25 :: Maybe a
172-
ex25 = join' Nothing
172+
ex25 = join' Nothing -- Nothing

src/chapter-12/exercises.hs

+27-20
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,35 @@ instance Functor Tree where
99
fmap g (Node a x b) = Node (fmap g a) (g x) (fmap g b)
1010

1111
-- Exercise 2
12-
instance Functor ((->) a) where
13-
-- fmap :: (x -> y) -> ((->) a x) -> ((->) a y)
14-
-- fmap :: (x -> y) -> (a -> x) -> (a -> y)
15-
-- fmap f1 f2 = \x -> f1 (f2 x)
16-
-- fmap f1 f2 = f1 . f2
17-
fmap = (.)
12+
-- instance Functor ((->) a) where
13+
-- -- fmap :: (x -> y) -> ((->) a x) -> ((->) a y)
14+
-- -- fmap :: (x -> y) -> (a -> x) -> (a -> y)
15+
-- -- fmap f1 f2 = \x -> f1 (f2 x)
16+
-- -- fmap f1 f2 = f1 . f2
17+
-- fmap = (.)
18+
19+
-- instance Functor [] where
20+
-- -- fmap :: (x -> y) -> ((->) a x) -> ((->) a y)
21+
-- -- fmap :: (x -> y) -> (a -> x) -> (a -> y)
22+
-- -- fmap f1 f2 = \x -> f1 (f2 x)
23+
-- -- fmap f1 f2 = f1 . f2
24+
-- fmap = (.)
1825

1926
-- Exercise 3
20-
instance Applicative ((->) r) where
21-
pure :: a -> f a
22-
-- pure :: a -> (r -> a)
23-
-- pure a = \_ -> a
24-
-- pure a = const a
25-
pure = const
26-
27-
-- (<*>) :: f (a -> b) -> f a -> f b
28-
-- (<*>) :: ((->) r) (a -> b) -> ((->) r) a -> ((->) r) b
29-
-- (<*>) :: (->) r (a -> b) -> (->) r a -> (->) r b
30-
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
31-
-- (<*>) f g x = f x (g x)
32-
-- (<*>) f g = \x -> f x (g x)
33-
f <*> g = \x -> f x (g x)
27+
-- instance Applicative ((->) r) where
28+
-- pure :: a -> f a
29+
-- -- pure :: a -> (r -> a)
30+
-- -- pure a = \_ -> a
31+
-- -- pure a = const a
32+
-- pure = const
33+
34+
-- -- (<*>) :: f (a -> b) -> f a -> f b
35+
-- -- (<*>) :: ((->) r) (a -> b) -> ((->) r) a -> ((->) r) b
36+
-- -- (<*>) :: (->) r (a -> b) -> (->) r a -> (->) r b
37+
-- (<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
38+
-- -- (<*>) f g x = f x (g x)
39+
-- -- (<*>) f g = \x -> f x (g x)
40+
-- f <*> g = \x -> f x (g x)
3441

3542
-- Exercise 4
3643
newtype ZipList a = Z [a] deriving (Show)

0 commit comments

Comments
 (0)