2014/07/21 Haskellその2 練習問題を解く。
StartHaskell2 wikiの問題を解いてみる
問1:うるう年を判定する関数を書いてみよう。
- 西暦年が4で割り切れる年はうるう年
- ただし、西暦年が100で割り切れる年はうるう年でない
- ただし、西暦年が400で割り切れる年はうるう年
isLeap :: Int -> Bool
isLeap n
| n `mod` 400 == 0 = True
| n `mod` 100 == 0 = False
| n `mod` 4 == 0 = True
| otherwise = False
問2:FizzBuzz関数を実装してみよう。
- 引数が3で割れるときは"Fizz"を出力
- 引数が5で割れるときは"Buzz"を出力
- 引数が15で割れるときは"FizzBuzz"を出力
fizzBuzz :: Int -> String
fizzBuzz n
| n `mod` 15 == 0 = "FizzBuzz"
| n `mod` 3 == 0 = "Fizz"
| n `mod` 5 == 0 = "Buzz"
| otherwise = show n
問3:シーザー暗号を実装してみよう。
- IntとStringを引数にとってIntの分だけ文字列を右にずらす。
- 1と"abcd"を引数にとったら"bcde"を返す。
import Data.Char
ceasar :: Int -> String -> String
ceasar n xs = map chr $ map (+n) $ map ord xs
未完成。本来はa~z A~Zという範囲で変換を行い、制御文字や記号文字は固定であるのだが、これは全てずらすような関数になっている。
問4:リストの長さを返す関数を、再帰を使って自分で書いてみる。
- myLengthはリストを引数にとってIntを返す。
myLength :: [a] -> Int
myLength [] = 0
myLength (x:xs) = 1 + myLength xs
問5:リストの要素を足す関数とかける関数を、再帰を使って自分で書いてみる。
- mySumはIntのリストを引数にとってIntを返す。
- myProductはIntのリストを引数にとってIntを返す。
mySum :: [Int] -> Int
mySum [] = 0
mySum (x:xs) = x + mySum xs
myProduct :: [Int] -> Int
myProduct [] = 1
myProduct (x:xs) = x * myProduct xs
もっと一般的に定義したいなら
mySum' :: (Num a) => [a] -> a
mySum' [] = 0
mySum' (x:xs) = x + mySum' xs
型クラス制約をつけてあげれば良いと思います。