2016-06-20 4 views
0

一部の関数言語では、部分的に適用される関数とカルト関数は、2つの類似しているが異なる概念です。ハスケルで部分的なアプリケーションとカリングの概念は交換可能ですか?

本はLearn You a Haskell for Great Goodという本を読んで、これらは同じ意味で適用されているようです。

[カリング関数] Haskellのすべての関数は、公式に1つのパラメータしか取りません。

...

我々はあまりにもいくつかのパラメータを持つ関数を呼び出す場合、私たちは取り残さできるだけ多くのパラメータをとる関数を意味し、部分的に適用された機能を取り戻します。

私の質問は:ハスケルで部分的なアプリケーションとカリングの概念は交換可能ですか?

+0

正直な答えは短く、はいです。 – hao

+3

私にとって、「カリング」は関数定義と関係があるのに対し、「部分アプリケーション」は関数呼び出しと関係がある。したがって、彼らは*正確には交換可能ではありませんが、彼らは同じコインの裏返しであり、どちらも他のものなしでは有意義ではありません。いくつかの関数型言語で「類似しているが区別されている」と言いますと、正確には何を指していますか? – ruakh

+0

* typeシステム*は排他的にカリー化された単項関数を扱いますが、GHCの生成コード*の関数は複数の引数をとることに注意してください。クロージャは、部分的に適用される関数に対してのみ割り当てられます。これは、コードがカリー化された解釈の下でタイプチェックされているため可能です。これは、世話していない解釈に対する同形*です。つまり、型保存の最適化です。 –

答えて

4

これらは異なっていますが、関連する概念です。関数定義はカリー化されているので、関数を部分的に適用すると(つまり、引数が期待するよりも少ない引数で呼び出すと)、引数の数が少ない別の関数が返されます。

あなたが部分的にそれを適用することができるようにカリー化のプロセスは

function(x) {return function(y) {return x+y;};} 

カリー化があるに

function(x,y) {return x+y;} 

を回し、単項関数のN「層」とN-aryの機能を置き換えています関数の定義の一部であり、部分的なアプリケーションは、関数を呼び出すときに関数で行うことです。

関連する問題