15

たとえば、自由変数のない参照透過関数:

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 つ以上の自由変数を含む関数はクロージャと呼ばれます。

では、「純粋関数」の定義は何ですか?

4

3 に答える 3

3

ウィキペディアの定義は、純粋な関数が定数を使用してその答えを計算できる限り、不完全です。

見ると

increment n = 1+n

これは明らかです。それは明らかなので、おそらく言及されていません。

Haskell の秘訣は、最上位の値と関数が定数であるだけでなく、クロージャー内でも変数 (!) が閉じられていることです。

add x = (\y -> x+y)

Herexは、適用した値を表します。これを変数addと呼ぶのは、 の右辺内で変化する可能性があるからではなく、適用するたびに異なる可能性があるためです。それでも、ラムダの観点からは定数です。addaddx

したがって、自由変数は、使用される時点で常に定数値を指定するため、純度に影響を与えません。

于 2014-04-08T12:50:09.443 に答える
1

簡単な答えはイエスですfは純粋です

Haskellmapでは で定義されていfoldrます。それが機能的であることに同意しmapますか?もしそうなら、引数としてfoldr提供されなかったグローバル関数があったことは問題でしたか?map

Inmap foldrは自由変数です。それは疑いようがない。それが関数であっても、値に評価されるものであっても違いはありません。それは同じだ。

foldl関数やのような自由変数は、+関数型言語が存在するために不可欠です。それがなければ、抽象化はできず、言語は Fortran よりも劣っています。

于 2014-04-07T18:17:14.440 に答える