エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

関数プログラミングと無限論理多項式(27)

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();