ハスケルでは、関数は言語の本質的な部分です。主にハスケルはLambda Calculusに基づいています。
ラムダ微積分には、「自由変数」を持つ関数があります。つまり、直接変数として渡されなかった変数が使用されます。自由変数を持つ関数は、この場合「クロージャ」と呼ばれるものです。
自由変数を持つ関数はLCで非常に一般的であるため、Haskell言語の不可欠な部分も形成します。たとえば、ときにこれを書く:でも
f a b = \ c -> a * b + c
...または:
f a b c = a * b + c
...あなたも、まったく同じ結果と、これを書くことができ
f a b = let product = a * b in \ c -> product + c
...さらに同等の変更:
f a = \ b -> let product = a * b in \ c -> product + c
これはHaskellが本質的にフリー変数を持つ関数をすべてというように作成するため、常にクロージャが作成されるからです。これらの中には、コンパイラによって最適化されているものもありますが、自分で発見することができるよりも多くのクロージャが使用されることは想定しても安全です。
したがって、クロージャーの位置を確認しないでください。彼らはハスケルで特別なものではなく、常に使用されています。
興味深い質問...意図せずに作成されたクロージャによって、正確にはどういう意味ですか? –
@Jonathan Sterlingはほとんどの場合、ネストされた関数を作成します。通常、dflemstrは常に「クロージャー」を作成していると指摘しているため、それらは「クロージャー」と呼ばれる基準を満たします。 –
これは、haskellに名前を持つ価値のある概念でもありません。 curryingと部分的な適用を理解していますか、型の署名 'Int - > Int - > Int'が' Int->(Int-> Int) 'に相当するのはどうですか? – jberryman