|
| 1 | +-- Haskell版 |
| 2 | +sumList :: (Num a) => [a] -> a |
| 3 | +sumList [] = 0 |
| 4 | +sumList (x : xs) = x + sumList xs |
| 5 | + |
| 6 | +-- Haskellのfoldrと同じ |
| 7 | +reduce' :: (a -> b -> b) -> b -> [a] -> b |
| 8 | +reduce' _ x [] = x |
| 9 | +reduce' f x (a : l) = f a (reduce' f x l) |
| 10 | + |
| 11 | +-- reduce版 sum |
| 12 | +sumList' :: (Num a) => [a] -> a |
| 13 | +sumList' xs = reduce' (+) 0 xs -- reduce'はfoldrで置き換え可能 |
| 14 | + |
| 15 | +product' :: (Num a) => [a] -> a |
| 16 | +product' xs = reduce' (*) 1 xs |
| 17 | + |
| 18 | +-- Haskellにはandという関数がある |
| 19 | +allTrue :: [Bool] -> Bool |
| 20 | +allTrue xs = foldr (&&) True xs |
| 21 | + |
| 22 | +-- Haskellにはorという関数がある |
| 23 | +anyTrue :: [Bool] -> Bool |
| 24 | +anyTrue xs = foldr (||) False xs |
| 25 | + |
| 26 | +-- リストの連結を行う |
| 27 | +append' :: [a] -> [a] -> [a] |
| 28 | +append' xs ys = foldr (:) ys xs |
| 29 | + |
| 30 | +-- リストの中身を2倍にする |
| 31 | +doubleall :: (Foldable t, Num a) => t a -> [a] |
| 32 | +doubleall xs = foldr doubleandcons [] xs |
| 33 | + where |
| 34 | + doubleandcons num xs = (:) (2 * num) xs |
| 35 | + |
| 36 | +-- リストの中身を2倍にする(関数合成版) |
| 37 | +doubleall' :: (Foldable t, Num a) => t a -> [a] |
| 38 | +doubleall' xs = foldr ((:) . double) [] xs |
| 39 | + where |
| 40 | + double n = 2 * n |
| 41 | + |
| 42 | +-- リストの中身を2倍にする(map + 関数合成版) |
| 43 | +doubleall'' :: (Foldable t, Num a) => t a -> [a] |
| 44 | +doubleall'' xs = map' double xs |
| 45 | + where |
| 46 | + map' f xs = foldr ((:) . f) [] xs |
| 47 | + double n = 2 * n |
| 48 | + |
| 49 | +-- 2次元配列を全部足す |
| 50 | +sumMatrix :: [[a]] -> a |
| 51 | +sumMatrix xxs = (sum . map sum) xxs |
| 52 | + |
| 53 | +main :: IO () |
| 54 | +main = do |
| 55 | + -- リストの定義 |
| 56 | + print $ 1 : (2 : (3 : [])) -- [1, 2, 3] |
| 57 | + |
| 58 | + -- sum |
| 59 | + print $ sumList [1, 2, 3] -- 1 + 2 + 3 = 6 |
| 60 | + |
| 61 | + -- reduce版 |
| 62 | + print $ sumList' [1, 2, 3] |
| 63 | + print $ product' [1, 2, 3] -- 1 * 2 * 3 = 6 |
| 64 | + |
| 65 | + -- リストの要素が全てTrueか |
| 66 | + print $ allTrue [True, True, True] -- True |
| 67 | + print $ allTrue [True, True, False] -- False |
| 68 | + |
| 69 | + -- リストの要素が一つでもTrueか |
| 70 | + print $ anyTrue [True, True, True] -- True |
| 71 | + print $ anyTrue [True, True, False] -- True |
| 72 | + print $ anyTrue [False, False, False] -- False |
| 73 | + |
| 74 | + -- リストの連結 |
| 75 | + print $ append' [1, 2, 3] [4, 5] |
| 76 | + |
| 77 | + -- リストの中身を2倍にする |
| 78 | + print $ doubleall [1, 2, 3] |
| 79 | + print $ doubleall' [1, 2, 3] |
| 80 | + |
| 81 | + -- mapの発見 |
| 82 | + print $ doubleall'' [1, 2, 3] |
| 83 | + print $ sumMatrix [[1, 2, 3], [4, 5], [6, 7, 8, 9]] |
0 commit comments