トレーステーブルは、アルゴリズムをテストするために使用される手法です。
「テーブルは通常、複数列、複数行のテーブルの形式を取ります。各列には変数が表示され、各行にはアルゴリズムに入力された各数値とそれに続く変数の値が表示されます。」 〜 ウィキペディア
純粋な関数型言語では変数は値を変更しませんが、この手法にはいくつかの用途がありますか?
純粋な関数型言語(または純粋なスタイルで他の方法で不純な言語でプログラミングする場合)ではあまり役に立ちません。ただし、少し異なる解釈をすることで、それを利用することができます。再帰関数では、パラメーターバインディングは関数内の値を変更しない場合がありますが、再帰呼び出しごとに、同じパラメーターは異なる値にバインドされます。再帰呼び出しをシーケンスとして再解釈しますが、パラメーターはまだ表示であり、時間の経過とともにバインディングを変更します(実際には異なるですが)別の動的スコープ(スタックフレーム)でのバインディング)。
クイック検索中に見つけたトレーステーブルの例はすべてループを含み、末尾再帰は本質的に純粋なループ方法です。 「標準的な」末尾再帰階乗の例を見てみましょう。
factorial n = fact' n 1
where
fact' 0 acc = acc
fact' n acc = fact' (n-1) (n*acc)
末尾再帰ヘルパー関数のトレーステーブルを簡単に作成できますfact'
、階乗を4とします。
n acc
--------
4 1
3 4
2 12
1 24
0 24
--------
ret: 24
技術的に言えば、n
とacc
は変化せず、5つの異なるn
sとacc
sがあります。しかし、あなたはまだそれをこのように考えることができます。
ただし、純粋関数型プログラミングの状態変化について考えるよりも、データフローについて考える方が役立つことがよくあります。そして、マップ、フォールド、スキャン、モノイド、モナド、ファンクター、矢印、半群など、より高レベルでより抽象的な概念で考えます。 factorial
は簡単にfold
として表すことができます:
factorial 0 = 1
factorial n = foldl1 (*) [1..n]