takeWhileAcc

リストの要素を先頭から見て,特定の条件を満すあいだだけ,要素をとりだしたいとき,takeWhileを使う.条件をすこし一般化して,先頭からの畳み込み値にも依存するようにしたいことが結構あるような気がする.というわけで、takeWhileAccを定義してみた.

takeWhileAcc :: (a -> b -> Bool) -> (a -> b -> a) -> a -> [b] -> [b]
takeWhileAcc p a z = unfoldr phi . (z,)
  where
    phi (z,x:xs) | p z x = Just (x,(a z x,xs))
    phi _ = Nothing

一般化できそうな気がしますよね.ここからの一般化については,また今度.
これを使うと,takeWhileは以下のように定義できる.

takeWhile p = takeWhileAcc ((. p) . flip const) undefined undefined