これが古い根拠を超えている場合は申し訳ありません。これは[以前に議論された]であることに気づきました。カリー化と部分適用の違いは何ですか? . 用語についてはまだ明確にしたいと思います。
カリー化により部分適用が可能になり、カリー化されていない関数には部分適用が不可能であると言うのが正しいでしょうか? 部分適用を自動的にサポートする Haskell のような言語では、すべての関数が暗黙的にカリー化されていると言っても過言ではありませんか?
これが古い根拠を超えている場合は申し訳ありません。これは[以前に議論された]であることに気づきました。カリー化と部分適用の違いは何ですか? . 用語についてはまだ明確にしたいと思います。
カリー化により部分適用が可能になり、カリー化されていない関数には部分適用が不可能であると言うのが正しいでしょうか? 部分適用を自動的にサポートする Haskell のような言語では、すべての関数が暗黙的にカリー化されていると言っても過言ではありませんか?
カリー化と部分適用はどちらも、言語が高階関数をサポートしていることを意味します。つまり、関数をデータとして渡すことは、他の方法では役に立たないためです。高階関数を使用すると、カリー化と部分適用の両方を手動で実装できます。 。
上記を除けば、それらは別々のアイデアです。
ループを持つことでwhile
「有効化」for
またはforeach
ループすると思いますか?ある意味ではそれは真実ですが、ループについては何も役に立ちません。
部分適用とは、まさにそれが言うことを意味します。引数の一部に関数を適用して、残りの引数のみを必要とする特殊なバージョンを作成します。これは、関数をカリー化するかどうかに関係apply_foo_to_baz(baz) = ((bar, quux) => foo(bar, baz, quux));
なく実行できます。疑似コードを許可する場合は、ラッパー関数を使用して、のように引数を調整します。
カリー化foo1(bar, baz, quux);
とは、のように複数のパラメーターを受け取る関数を、のように一度に1つの引数に適用される関数に変換することを意味しますfoo2(bar)(baz)(quux);
。foo2
関数が取る引数は1つだけなので、より少ない引数に適用することは、技術的には部分適用ではありません。foo2
これがのカレーバージョンであることを知っていると、の部分的に適用された形式であるfoo1
と考えることができますが、特定の数の引数が与えられた場合に「部分的に適用」されるカレー関数については一般的に何もありません。foo2(bar)
foo1
Haskellに関する限り、通常の方法で定義された関数は、実際にはデフォルトでカレーされています(どちらも同じ人にちなんで名付けられているため、これは適切です)。実際、実装の詳細に依存せずに、Haskellで「部分適用」が何を意味するかを有用に定義するのは実際には少し注意が必要です。