F# の例(4)
F# 版も同様に修正します。
Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。
member this.Copy(): Numbers = new Numbers(number, square_difference, scale)
UnfoldL 関数を作成します。
let rec UnfoldL<'T, 'U> (f: 'T -> 'U * 'T) (init: 'T) = seq { let (dst, src) = f init yield dst yield! UnfoldL f src }
NextNumbers を以下の NextDigitAndNumbers で置き換えます。
let NextDigitAndNumbers (numbers: Numbers): int * Numbers = let numbers_copy = numbers.Copy() let dd = numbers_copy.GetNextDecimalDigit (dd, numbers_copy)
Calc クラスの IterateServer メソッドは以下のように UnfoldL を使うように変更します。
member this.IterateServer(): string = let number: LongDecimal = new LongDecimal() let square_difference: LongDecimal = new LongDecimal(3) let init_numbers: Numbers = new Numbers(number, square_difference, 0) let list = Seq.toList (Seq.take count (UnfoldL NextDigitAndNumbers init_numbers)) (new LongDecimal(list)).Print();