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

関数filter, partition

filters.hs

関数filter

動作

リストから条件を満たすものだけをとりだす。

% ghci
Prelude> filter even [3, 8, 2, 4, 5, 9, 6, 7]
[8,2,4,6]
Prelude> :m Data.Char
Prelude Data.Char> filter isUpper "He And She Know Everyone Likes Lisp.\n"
"HASKELL"

filterRaw, filterF :: (a -> Bool) -> [a] -> [a]

条件とリストをとり条件を満たす要素から成るリストを返す。条件は真偽値を返す関数だ。

生の再帰

filterRaw p (x : xs)
| p x = x : filterRaw p xs
| otherwise = filterRaw p xs
filterRaw _ _ = []

xが条件を満たすとき残りの要素をろ過したリストにxを追加する。そうでないなら残りの要素をろ過したリストをそのまま返す。

関数foldr

filterF p = foldr (\x -> if p x then (x :) else id) []

xが条件を満たすなら第2引数にxを追加しそうでないならそのまま返す関数をfoldrに与えている。

関数partition

動作

リストを条件を満たすものと満たさないものにわける。

Prelude Data.Char> :m + Data.List
Prelude Data.Char Data.List> partition even [3, 8, 2, 4, 5, 9, 6, 7]
([8,2,4,6],[3,5,9,7])
Prelude Data.Char Data.List> partition isUpper "He And She Know Everyone Likes Lisp.\n"
("HASKELL","e nd he now veryone ikes isp.\n")

partitionRaw, partitionF :: (a -> Bool) -> [a] -> ([a], [a])

返り値は条件を満たすもののリストと満たさないもののリストのタプルだ。

生の再帰

partitionRaw p (x : xs)
| p x = (x : ts, es)
| otherwise = (ts, x : es)
where (ts, es) = partitionRaw p xs
partitionRaw _ _ = ([], [])

残りのリストを2つにわけてそれぞれでts, esを束縛する。xが条件を満たすならtsに追加しそうでないならesに追加する。

関数foldr

partitionF p = foldr
(\x (ts, es) -> if p x then (x : ts, es) else (ts, x : es))
([], [])

xが条件を満たすならひとつめのリストに、そうでないならふたつめのリストに、それぞれ追加する関数をfoldrに与えている。

まとめ

関数filter, partitionをそれぞれ生の再帰と関数foldrで定義した。

「関数map」へもどる 「関数take, drop, splitAt」へ

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