Seq.cache - Memoize

F#って標準でmemoizeもどき君が備わってたような、どんな関数だっけ・・・と思っていた矢先、@igetaさんのつぶやきの中からその関数を発見!白骨!発掘!
その名もSeq.cacheさんでした。忘れないように軽くメモしておこうと思います。

> let test1 = seq { for x in 1..10 -> printf "%d " x ; x } ;;
> let test2 = Seq.cache <| test1 ;;

// 何回も計算されちゃう!
> Seq.nth 3 test1 ; Seq.nth 3 test1 ;;
1 2 3 4 1 2 3 4 

// test2はキャッシュが効いてる
> Seq.nth 3 test2 ; Seq.nth 3 test2 ;;
1 2 3 4
> type Foo(id:int) =
    member self.ID = id
    override self.ToString() = id.ToString()
;;
// ふーちゃんの無限リスト
> let objects = Seq.cache <| seq { for x in 0. .. 1./0. -> new Foo((int)x) } ;;

> Seq.nth 300 objects ;; // 300個生成されてるはず
val it : Foo = 300 {ID = 300;}