TrueLogic 仕事日記 このページをアンテナに追加 RSSフィード

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"

n757ufn757uf2010/02/12 16:49メーリングリストで頂いたコメントをメモしておきます.
--
リストが空かどうかを判定するには、少なくとも二つの方法があります。
(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

トラックバック - http://specverification.g.hatena.ne.jp/n757uf/20100131