2010-01-31 Real World Haskell 第3章の練習問題
第3章の練習問題(P72)をやってみた.
1.リストの長さ
myLength :: [a] -> Int myLength [] = 0 myLength (x:xs) = 1 + myLength xs
2. そのテストプログラム
testLength :: [a] -> String
testLength l
| length l == myLength l = "OK"
| otherwise = "NG"
-- testLength []
-- testLength [1,2,3,4,5]
3.リストの平均値
sumList :: [Double] -> Double sumList [] = 0 sumList (x:xs) = x + sumList xs aveList :: [Double] -> Double aveList a = (sumList a) / fromIntegral (myLength a) -- aveList [3,4]
4. 回文をつくる
myKaibun :: [a] -> [a] myKaibun = myKaibun (x:xs) = [x] ++ (myKaibun xs) ++ [x]
5. 回文の判定
myKaibunHantei :: [Char] -> String myKaibunHantei [] = "OK" myKaibunHantei (x:[]) = "OK" myKaibunHantei (x:xs) = if x == (last xs) then myKaibunHantei (init xs) else "NG"
トラックバック - http://specverification.g.hatena.ne.jp/n757uf/20100131
--
リストが空かどうかを判定するには、少なくとも二つの方法があります。
(1) 空リスト [] でパターンマッチ
(2) 関数 null :: [a] -> Bool で判定
パターンマッチは遅延評価されることもあり、(2) のほうが
(1)よりも計算時間の意味で効率的です。特に、文字列など
で顕著に差が現れるので、知っておくといいでしょう。
--
foldrパターンが使える(これは高度だな)
myLength :: [a] -> Int
myLength = foldr (\x y -> y + 1) 0
= foldr (const (+ 1)) 0
--
これはエレガント!
isKaibun :: String -> Bool
isKaibun xs = xs == reverse xs