Foundations of F#を読む(3)

やっとこさ、3章読了。

だいたい理解できたんだけど、Lazy Evaluationの最後の例だけがよくわからなかった。

これ↓でフィボナッチ数列が求まるらしい。

#light
let fibs =
  Seq.unfold
    ( fun (n0, n1) ->
      Some(n0, (n1, n0 + n1)))
    (1I, 1I)
let first20 = Seq.take 20 fibs
print_any first20

unfoldってなんだろう。

ちょっと調べてみたけど、まずはfoldを知る必要がありそう。

foldは引数が3つあって、1つめが実行する関数、2つめが初期値、3つめがデータ列(ListやSeq)となっている。そして、初期値とデータ列の1つめのデータを関数で処理し、その結果と2つめのデータを関数で処理・・・というのを繰り返して結果を得るもののようだ。

下記の例では、数列の合計値を求めている。

#light
let add a b = a + b
let sum x = Seq.fold add 0 x
let seq = [1 .. 10]
printf "sum = %d" (sum seq)

絵で描くとこんなイメージだろうか。

unfoldはこれの逆で、種を与えてあげるとリストを返してくれるものらしい。