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

関数unfoldrとdropWhileによる関数filterの定義

filter_unfoldr.hs

はじめに

覚えるのではなくなれることを目指す。正解はひとつではない。関数filterを関数unfoldrとdropWhileで定義してみよう。

考えかた

うけとったリストから条件を満たさないものを落としたうえで、リストの第1要素を結果のリストに入れ残りを状態として次にわたす。

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

コード

filterU p = unfoldr $ \l -> case dropWhile (not . p) l of
x : xs -> Just (x, xs)
_ -> Nothing

まとめ

正解はひとつではない。だからこそ逆に「これ以外にない」という美しい解が見つかったときは気持ちが良い。フィボナッチ数列の「リストの再帰的定義」による定義など。

「関数takeWhile, dropWhile, span」へもどる 「関数zip, zipWith, unzip」へ

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