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

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

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

JavaScript の例(5) (TypeScript)

TypeScript 版も同様に修正します。

Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。

    Copy(): Numbers {
        return new Numbers(this.number, this.square_difference, this.scale);
    }

UnfoldL 関数を作成します。Iterate を UnfoldL で置き換えます。

function* UnfoldL<T, U>(next: (T) => [U, T], init: T): Iterable<U> {
    var src: T = init;
    for (; ;) {
        var cpl: [U, T] = next(src);
        // 終了したとき next は null を返すとする
        if (cpl == null) {
            break;
        }
        yield cpl[0];
        src = cpl[1];
    }
}

NextNumbers を以下の NextDigitAndNumbers で置き換えます。

function NextDigitAndNumbers(numbers): [number, Numbers] {
    var numbers_copy: Numbers = numbers.Copy();
    var dd: number = numbers_copy.GetNextDecimalDigit();
    return [dd, numbers_copy];
}

Calc クラスの IterateServer メソッドは以下のように UnfoldL を使うように変更します。GetNextDecimalDigit を1回呼び出しているところは削除します。

    IterateServer(): string {
        var number = new LongDecimal([]);
        var square_difference = new LongDecimal([3]);
        var init_numbers = new Numbers(number, square_difference, 0);
        return new LongDecimal(Take(this.count, UnfoldL(NextDigitAndNumbers, init_numbers))).Print();
    }