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

関数unfoldrの定義

はじめに

素因数分解に使用した関数unfoldrの定義を学ぶ。

素因数分解

factorization :: Integer -> [Integer]
factorization n = case popFactor n of
Nothing -> []
Just (f, n') -> f : factorization n'

myUnfoldr :: (b -> Maybe (a, b)) -> b -> [a]

型bの値を変化させながら型aの値をリストに集めるということだ。

定義

myUnfoldr f s = case f s of
Nothing -> []
Just (x, s') -> x : myUnfoldr f s'

現在の状態から結果の値と次の状態を求める関数を適用し、次の状態からのリストを求めてそれに結果の値を追加する。

イマジン

状態をs, s', s'', s'''と変化させながらx, x', x''を後に残していく感じだ。パン屑を落としながら歩いていくヘンゼルのようなものだ。

まとめ

関数iterateでは結果と状態が同じ値である必要があった。それら2つを別々の値とし、さらに終了条件も含めた枠組みが関数unfoldrだ。

課題

  1. 整数の10進数表現の各桁の数を下から順に列挙したリストを返す関数を書け
  2. 1で関数unfoldrを使ったなら生の再帰で、生の再帰を使ったなら関数unfoldrを使って書き直せ

「素因数分解」へもどる 「関数takeToの関数unfoldrによる定義」へ

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