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

関数takeWhile, dropWhile, span

takewhiles.hs

関数takeWhile

動作

条件を満たすあいだ値をとりだす。

% ghci
Prelude> takeWhile even [4, 10, 8, 2, 5, 4, 1, 3, 2, 9]
[4,10,8,2]

takeWhileRaw, takeWhileF, takeWhileU :: (a -> Bool) -> [a] -> [a]

生の再帰

takeWhileRaw p (x : xs) | p x = x : takeWhileRaw p xs
takeWhileRaw _ _ = []

先頭の値が条件を満たせば残りのリストに同じ関数を適用した結果の先頭にその値を追加したものが返り値となる。先頭の値が条件を満たさないか空リストならば空リストだ。

関数foldr

takeWhileF p = foldr (\x -> if p x then (x :) else const []) []

xが条件を満たせばそれを追加しそうでないならつねに空リストを返す関数でたたみこみを行っている。

関数unfoldr

takeWhileU p = unfoldr $ \l -> case l of
x : xs | p x -> Just (x, xs)
_ -> Nothing

リストが空リストではなく先頭の値xが条件を満たすならば結果のリストにxを追加し、残りのリストを次の処理にわたす。

関数dropWhile

動作

条件を満たすあいだ値を落とす。

Prelude> dropWhile even [4, 10, 8, 2, 5, 4, 1, 3, 2, 9]
[5,4,1,3,2,9]

dropWhileRaw :: (a -> Bool) -> [a] -> [a]

生の再帰

dropWhileRaw p (x : xs) | p x = dropWhileRaw p xs
dropWhileRaw _ xs = xs

先頭が条件を満たすならばそれを落として同じ処理を続ける。そうでないならそのままのリストを返す。

関数span

動作

条件を満たすまでと残りとにわける。

Prelude> span even [4, 10, 8, 2, 5, 4, 1, 3, 2, 9]
([4,10,8,2],[5,4,1,3,2,9])

spanRaw :: (a -> Bool) -> [a] -> ([a], [a])

生の再帰

spanRaw p (x : xs) | p x = (x : t, d)
where (t, d) = spanRaw p xs
spanRaw _ xs = ([], xs)

先頭の値が条件を満たすうちはタプルの第1要素に値を追加する。そうでなければ第1要素は空リストで第2要素は与えられたリストとするタプルを返す。

まとめ

関数takeWhile, dropWhile, spanを定義した。

「関数take, drop, splitAt」へもどる 「関数unfoldrとdropWhileによるfilterの定義」へ

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