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;}