2014/07/21 Haskellその2 練習問題を解く。

StartHaskell2 wikiの問題を解いてみる

問1:うるう年を判定する関数を書いてみよう。

				
isLeap :: Int -> Bool
isLeap n 
  | n `mod` 400 == 0 = True
  | n `mod` 100 == 0 = False
  | n `mod`   4 == 0 = True
  | otherwise = False
			    
			

問2: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:シーザー暗号を実装してみよう。

				
import Data.Char
ceasar :: Int -> String -> String
ceasar n xs = map chr $ map (+n) $ map ord xs
			    
			
未完成。本来はa~z A~Zという範囲で変換を行い、制御文字や記号文字は固定であるのだが、これは全てずらすような関数になっている。

問4:リストの長さを返す関数を、再帰を使って自分で書いてみる。

				
myLength :: [a] -> Int
myLength [] = 0
myLength (x:xs) = 1 + myLength xs
			    
			

問5:リストの要素を足す関数とかける関数を、再帰を使って自分で書いてみる。

				
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

型クラス制約をつけてあげれば良いと思います。
			    
			

今日はここまで!