すごい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行目で、タプルを作ります。
続く。