Stream.fromとクロージャ

特にこうやってその場でstatic変数モドキができるのは覚えとこう……。Haskellでは考えられないし(できるけど普通はやらない←ツッコミ避け)、クロージャがスタックに縛られているDやAdaでも考えられず、今までに経験してこなかったパターンなので。

# let s = Stream.from ((fun () -> let z = ref 0 in fun i -> z := !z + 1; Some !z) ());;
val s : int Stream.t = <abstr>
# Stream.next s;;
- : int = 1
# Stream.next s;;
- : int = 2
# Stream.next s;;
- : int = 3

外のfun要らなかった。どうもまだGCに頭がついていけてないです。

# let s = Stream.from (let z = ref 0 in fun i -> z := !z + 1; Some !z);;
val s : int Stream.t = <abstr>