たとえば、自由変数のない参照透過関数:
g op x y = x `op` y
は、( の観点からf
) 自由な変数op
と を持つ関数になりましたx
:
x = 1
op = (+)
f y = x `op` y
f
参照透過性もあります。しかし、それは純関数ですか?
純粋な関数ではない場合、参照透過的であるが、外側のスコープにバインドされた 1 つ以上の変数を使用する関数の名前は何ですか?
この質問の動機:
ウィキペディアの記事からはわかりません:
結果値は、すべて (またはいずれか) の引数値に依存する必要はありません。ただし、引数の値以外に依存する必要はありません。
(私のものを強調)
また、 Google検索からも、純粋な関数が自由な (関数のスコープにバインドされていないという意味で) 自由な変数に依存できるかどうかはわかりません。
また、この本には次のように書かれています。
自由変数のない関数が純粋なら、クロージャーは不純ですか?
関数
function (y) { return x }
は面白いです。これには、自由変数 x が含まれます。自由変数は、関数内でバインドされていない変数です。これまで、変数を「バインド」する方法は 1 つしか見てきませんでした。つまり、同じ名前の引数を渡すことです。関数function (y) { return x }
には x という名前の引数がないため、変数 x はこの関数にバインドされず、「フリー」になります。</p>関数で使用される変数が束縛されているか自由であるかがわかったので、関数を自由変数を持つものと持たないものに分けることができます。
- 自由変数を含まない関数は純粋関数と呼ばれます。
- 1 つ以上の自由変数を含む関数はクロージャと呼ばれます。
では、「純粋関数」の定義は何ですか?