むずかしめのパソコン勉強の記録

計算機科学とか関数型言語とか

すごいHaskellたのしく学ぼう 第4章 再帰の練習 その2

第4章の続き。
前の:
http://ugnom.hatenablog.com/entry/2013/12/30/131136


再帰の練習です。

take

ある配列の最初の第一引数の数だけ取り出す。
ついでに、最後から指定数だけ取るのも作ってみました。

take' :: Int -> [a] -> [a]
take' n (x:xs)
    | n <= 0 = []
    | otherwise = x : take' (n-1) xs 

takeLast :: Int -> [a] -> [a]
takeLast _ [] = []
takeLast n l@(x:xs)
    | n >= length l = x : takeLast n xs
    | otherwise = takeLast n xs

takeLastのほうは別にlentghを使わなくてもできたのではないかと思うのですが、ちょっと思いつきませんでした。。
特に解説はいらないと思います。単純なパターンマッチングと場合分けです。

reverse


リストを受け取って反転させたリストを返す。

reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]

(++)は文字列を連結させる関数。

Prelude> :i ++
(++) :: [a] -> [a] -> [a] 	-- Defined in `GHC.Base'

Prelude> "asd" ++ "123"
"asd123"

zip

zipは受け取った2つのリストをタプルのリストとして返します。
その他の仕様として、返すリストの長さは短い方にそろいます。

zip' :: [a] -> [b] -> [(a,b)]
zip' [] _ = []
zip' _ [] = []
zip' (x:xs) (y:ys) = (x, y) : zip' xs ys

2−3行目で、短い方のリストに長さを合わせるようにします。短い方が空になり次第終わり。
4行目で、タプルを作ります。


続く。