top page > computer > haskell > web_lecture > for_programmer > take_def.html
更新日:
文責: 重城良国

関数take, drop, splitAt

takes.hs

関数take

動作

指定した数の要素をとりだす。

% ghci
Prelude> take 4 "monkey"
"monk"

takeRaw, takeU :: Int -> [a] -> [a]

生の再帰

takeRaw n (x : xs) | n > 0 = x : takeRaw (n - 1) xs
takeRaw _ _ = []

x : xsからn個とるのは値xをxsからn - 1個とったリストに追加することだ。

関数unfoldr

メモ: 関数curryとunfoldrを組み合わせる部分に説明を追加する

全体に関するメモ: 「定石」や「慣用句」についての独立した説明を追加する。たとえば(f .) . gのような表現やuncurryを使った書きかたの練習等を追加したい。

takeU = curry . unfoldr $ \nl -> case nl of
(n, x : xs) | n > 0 -> Just (x, (n - 1, xs))
_ -> Nothing

結果としてxを出しnを1減らしもとのリスト(x : xs)から要素をひとつ削る。

関数drop

動作

指定された数だけ要素を落とす。

Prelude> drop 3 "monkey"
"key"

dropRaw :: Int -> [a] -> [a]

生の再帰

dropRaw n (x : xs) | n > 0 = dropRaw (n - 1) xs
dropRaw _ xs = xs

nが0より大きいときリスト(x : xs)からn個落としたリストはリストxsからn - 1個落としたリストに等しい。もとのリストが空リストまたはnが0以下ならばリストはそのままだ。

関数splitAt

動作

リストの先頭n個をとりだし、残りとともにタプルとして返す。

Prelude> splitAt 3 "monkey"
("mon", "key")

splitAtRaw :: Int -> [a] -> ([a], [a])

生の再帰

splitAtRaw n (x : xs) | n > 0 = (x : t, d)
where (t, d) = splitAtRaw (n - 1) xs
splitAtRaw _ xs = ([], xs)

nが0より大であればxsをn - 1の場所で2つに分けた前半のリストにxを追加する。そうでないなら返り値は空リストともとのリストだ。

まとめ

関数take、drop、partitionを定義した。

「関数filter, partition」へもどる 「関数takeWhile, dropWhile, span」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics