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

関数foldrで関数dropを定義

dropF :: Int -> [a] -> [a]

定義

step _ f n | n > 0 = f $ n - 1
step x f _ = x : f 0

fdrop :: [a] -> Int -> [a]
fdrop (x : xs) n = step x (fdrop xs) n
fdrop _ _ = []

これも同じようにstep x (fdrop xs) nを展開してみよう。

fdrop (x : xs) n | n > 0 = fdrop xs (n - 1)
fdrop (x : xs) _ = x : fdrop xs 0
fdrop _ _ = []

仮引数nを消す。

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

関数foldrで表現する。

dropF = flip $ foldr s (const [])
where
s _ f n | n > 0 = f $ n - 1
s x f _ = x : f 0

何が起きたのか

関数(step x)はnが1以上では「リスト[x1, x2, ...]からnだけ落とした関数」を「リスト[x, x1, x2, ...]からnだけ落とした関数」に変換する。nが0以下のときは「リスト[x1, x2, ...]から0だけ落とした関数」を「リスト[x, x1, x2, ...]から0だけ落とした関数」に変換している。後者の変換は返り値に(x :)することで行っている。

「関数foldrで関数takeを定義」へもどる 「関数foldrで関数splitAtを定義」へ

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