課題1
指示
リストの最後の要素を取得する関数 myLast を作れ。
ただし、再帰を用いること。
Prelude> myLast [1, 2, 3, 4]
4
解答例
myLast.hs
myLast :: [a] -> a
myLast = f where
f [] = error "No last for empty list"
f [x] = x
f (_ : xs) = f xs
課題2
指示
リストの最後の要素を取得する関数 myLast を作れ。
ただし、再帰を用いず、Prelude にある関数を合成して作成すること。
Prelude> myLast [1, 2, 3, 4]
4
解答例
myLast2.hs
myLast :: [a] -> a
myLast = head . reverse
課題3
指示
リストの n 番目の要素を取得する関数 myIndex を作れ。
Prelude> myIndex [1, 2, 3, 4] 2
2
Prelude> myIndex [1, 2, 3, 4] 3
3
解答例
myIndex.hs
myIndex :: [a] -> Int -> a
myIndex = f where
f [] _ = error "too large index"
f (x : xs) n
| n == 0 = x
| n > 0 = f xs (n - 1)
| otherwise = error "negative index"
課題4
指示
与えられた文字列を全て大文字に変える関数 myUpper を作れ。
Prelude> myUpper "aBcDeFghi"
ABCDEFGHI
解答例
myUpper.hs
myUpper :: String -> String
myUpper = map toUpper
課題5
指示
与えられた整数リストのうち、奇数だけの合計値を求めるoddSum
を作れ。
ただし、foldl
とfilter
を合成して作成すること。
Prelude> oddSum [1,2,3,4,5,8,9,11]
29
解答例
oddSum.hs
oddSum :: [Int] -> [Int]
oddSum = foldl (+) 0 . filter odd
課題6
指示
与えられたテキストファイルに行番号を付与する関数 lineNum を作れ。
ただし、行番号の桁揃えなどを行わなくて良い。
解答例
lineNum.hs
lineNum :: [String] -> [String]
lineNum = f where
f = map g . zip [1..]
g (ln, st) = show ln ++ " " ++ st