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

関数foldrで関数zipを定義

ウォームアップ

「リストをとってそのリストと[x1, x2, x3, ...]とをタプルのリストにする関数」で「リストをとってそのリストと[x, x1, x2, x3, ...]とをタプルのリストにする関数」を定義することを考えよう。

まずは具体的な値で考える。fun1は[1, 2, 3, 4, 5]と何らかのリストとをタプルのリストにする関数だ。fun2は[10, 1, 2, 3, 4, 5]と何らかなリストとをタプルのリストにする関数だ。fun1を使ってfun2を定義せよ。let fun1 [y1, y2, y3, y4, y5] = [(1, y1), (2, y2), (3, y3), (4, y4), (5, y5)]としてから解答せよ。

zipF :: [a] -> [b] -> [(a, b)]

定義

step x f (y : ys) = (x, y) : f ys
step _ _ _ = []

zipS (x : xs) ya = step x (zipS xs) ya
zipS _ _ = []

step x (zipS xs) yaを展開してみよう。zipRawの定義と同じになることがわかる。仮引数yaを消す。

zipS (x : xs) = step x (zipS xs)
zipS _ = const []

これで関数foldrで表現できる。

zipF = foldr s (const [])
where
s x f (y : ys) = (x, y) : f ys
s _ _ _ = []

何が起きたのか

関数(step x)は「リストysをとってリストxsとのzipを返す関数」をとって「リストysをとってリスト(x : xs)とのzipを返す関数」を返す関数だ。リストxsをysで表現されるリストを扱う関数としてたたみこんでいる。

「関数foldrで関数spanを定義」へもどる 「関数foldrで関数zipWithを定義」へ

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