高階(別名高階)パラメトリック多相の場合、最初の値には型があります。パラメトリック型を型関数(型の関数)の一種と考えると、型には種類があります。たとえば、次IEnumerable<T>
の型関数です。種類*->*、この型関数に型を適用すると、種類*の型が得られます。したがって、型関数としてのパラメトリック型(型構築子)のこのビューを使用して、高階型関数、つまり型関数を引数として受け取る/返すことができる型関数について話し始めることができます。これは、より高度なポリモーフィズムとして知られており、JavaやC#などの言語に欠けている表現力の高い型システム機能です。C ++テンプレートについて知っている場合は、テンプレートテンプレートパラメータ(はい、テンプレートテンプレート)を介したそのようなものに対する制限はありますが、一貫性がなく、ほとんど役に立たないサポートがあります。
このような機能があるとなぜ便利なのか疑問に思われるかもしれません。それらは、より高いレベルの抽象化と、Monads&Functorsなどのより一般的なコードを表現することを可能にします。標準のHaskell98は、より種類の多いポリモーフィズムをサポートします。
1次関数の例では、最初に、ラムダ計算のすべての関数が1つの引数のみを取り、例の矢印が実際に右に関連付けられていることを理解する必要があります。これが実際の関数です。
f->gは0次です。f->(g-> h)は一次であり、関数は関数を返します。f->(g->(h-> i))は2次であり、関数は関数を返す関数を返します。
同じ「1つの引数のみ」は、type、kind、sorts(sortsを持つ種類)関数にも適用されます。