(これはこのサイトで既に回答されているはずですが、C の変数で free() を呼び出すという概念が検索に殺到します。)
f x = M x ==> M
x が「M でフリーでない」場合のように定義された「イータ リダクション」という用語に出くわしました。つまり、私はそれが言おうとしていることの要点を理解していると思います.関数をポイントフリースタイルに変換するときに何をするかのように見えますが、 x がフリーではないという修飾子が何を意味するのかわかりません.
(これはこのサイトで既に回答されているはずですが、C の変数で free() を呼び出すという概念が検索に殺到します。)
f x = M x ==> M
x が「M でフリーでない」場合のように定義された「イータ リダクション」という用語に出くわしました。つまり、私はそれが言おうとしていることの要点を理解していると思います.関数をポイントフリースタイルに変換するときに何をするかのように見えますが、 x がフリーではないという修飾子が何を意味するのかわかりません.
次に例を示します。
\f -> f x
このラムダでx
は、自由変数です。基本的に自由変数は、ラムダの引数 (またはlet
変数) の 1 つではないラムダで使用される変数です。ラムダのコンテキストの外から来ます。
Eta の削減は、次のように変更できることを意味します。
(\x -> g x) to (g)
ただし、x
が解放されていない (つまり、使用されていないか、引数である)場合に限りg
ます。そうしないと、未知の変数を参照する式を作成することになります。
(\x -> (x+) x) to (x+) ???
さて、ここに関連するウィキペディアの記事があります。
短いバージョンは、そのような定義は「M」のようなプレースホルダーを使用してラムダ式の本体を省略し、そのラムダによってバインドされている変数がプレースホルダーが表すものでは使用されないことを追加で指定する必要があるということです。
したがって、ここでの「自由変数」とは、あいまいまたは未知の外部スコープで定義された変数を大まかに意味します。たとえば、 のような式\y -> x + y
でx
は、自由変数ですが、y
そうではありません。
Eta 削減とは、バインドの余分なレイヤーを削除し、すぐに変数を適用することです。これは、(おそらくご想像のとおり) 問題の変数がその 1 か所でのみ使用されている場合にのみ有効です。