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

関数foldrで関数spanを定義

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

定義

step p x f True | p x = (x : t, d) where (t, d) = f True
step _ x f _ = ([], x : d) where (_, d) = f False

spanB :: (a -> Bool) -> [a] -> Bool -> ([a], [a])
spanB p (x : xs) b = step p x (spanB p xs) b
spanB _ _ _ = ([], [])

step p x (spanB p xs) bを展開する。

spanB p (x : xs) True | p x = (x : t, d) where (t, d) = spanB p xs True
spanB p xs _ = ([], x : d) where (_, d) = spanB p xs False

うえの式としたの式が等しいことを確認する。そのうえでしたの式の動きを見てみよう。p xを満たすうちはタプルの第1要素に値が追加しれていくが、p xを満たさなかった時点からはBool値はずっとFalseのままとなり、第2要素に値が追加されていくということだ。仮引数bを消す。

spanB p (x : xs) = step p x (spanB p xs)
spanB _ _ = const ([], [])

関数foldrで表せる。

spanB p = foldr (step p) (const ([], []))

ブール値の初期値としてTrueを与える。

spanF p = foldr (step p) (const ([], [])) True

ローカル関数を使う。

spanF p xs = foldr s (const ([], [])) xs True
where
s x f True | p x = (x : t, d) where (t, d) = f True
s x f _ = ([], x : d) where (_, d) = f False

「関数foldrで関数dropWhileを定義」へもどる 「関数foldrで関数zipを定義」へ

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