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

関数iterateの定義

はじめに

コラッツ数列の例で使った関数iterateの定義を学ぶ。

動作

コラッツ数列のもととなる無限リストの定義だ。

collatsInf :: Integer -> [Integer]
collatsInf n = n : collatsInf (collatsNext n)

関数iterateが使える。

collatsInf = iterate collatsNext

iterate f xは以下のような無限リストを生成する。

[x, f x, f (f x), f (f (f x)), f (f (f (f x))), ...]

% ghci
Prelude> take 10 $ iterate (+ 1) 0
[0,1,2,3,4,5,6,7,8,9]

次の値が前の値のみに依存するような数列を作るのに使える。

次を求める関数と初期値をとり初期値から次々に生成した値のリストを返す。

myIterate :: (a -> a) -> a -> [a]

定義

初期値に関数fを次々に適用していってできるリストは「初期値に関数fを適用したもの」を初期値として同じことをしたリストの先頭に初期値を追加したものだ。

myIterate f x = x : myIterate f (f x)

展開

展開してみるとうえの定義でうまくいくことがわかる。

myIterate f x
-> x : myIterate f (f x)
-> x : f x : myIterate f (f (f x))
-> x : f x : f (f x) : myIterate f (f (f (f x)))
...

まとめ

初期値に次々と関数を適用していくことで無限リストを作る関数iterateの定義を学んだ。

課題

  1. したのルールで値nから次の値を求めることで作られる無限リストを返す関数を書け
  2. 1で関数iterateを使ったなら生の再帰で、生の再帰を使ったなら関数iterateで書き直せ

「コラッツ数列」へもどる 「素因数分解」へ

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