いくつかの曖昧さをなくして、この混乱のいくつかを開始することを補います。人々はそれに慣れている傾向があるので、私はこれを説明するために値レベルのアナロジーを使用するのが好きです。
型コンストラクターは、型を「構築」するために型引数に適用できる型です。
値コンストラクターは、値を「構築」するために値引数に適用できる値です。
値コンストラクタは通常「関数」または「メソッド」と呼ばれます。これらの「コンストラクター」は「ポリモーフィック」(さまざまな「形状」の「もの」を作成するために使用できるため)、または「抽象化」(異なるポリモーフィックインスタンス間で異なるものを抽象化するため)とも呼ばれます。
抽象化/多態性のコンテキストでは、1次は抽象化の「単一使用」を指します。型を一度抽象化しますが、その型自体は何も抽象化できません。Java 5ジェネリックは一次です。
上記の抽象化の特徴付けの一次解釈は次のとおりです。
型コンストラクタは、適切な型引数に適用して適切な型を「構築」できる型です。
値コンストラクターは、適切な値を「構築」するために適切な値引数に適用できる値です。
値1
や型などの抽象化(これを「ゼロ次」と呼ぶことはできると思いますが、これがどこで使用されたかはString
わかりません)がないことを強調するには、通常、何かが「適切な」値または型であると言います。
適切な値は、引数を待機していないという意味で「すぐに使用可能」です(引数を抽象化しません)。それらは、簡単に印刷/検査できる値と考えてください(関数のシリアル化は不正です!)。
適切なタイプとは、値(値コンストラクターを含む)を分類するタイプであり、タイプコンストラクターは値を分類しません(適切なタイプを生成するには、最初に適切なタイプ引数に適用する必要があります)。タイプをインスタンス化するには、適切なタイプである必要があります(ただし十分ではありません)。(それは抽象クラスか、アクセスできないクラスかもしれません。)
「高次」とは、単に多形性/抽象化を繰り返し使用することを意味する一般的な用語です。これは、ポリモーフィックタイプと値についても同じことを意味します。具体的には、高次の抽象化は、何かを抽象化するものを抽象化します。タイプの場合、「高次」という用語は、より一般的な「高次」の特別な目的のバージョンです。
したがって、特性評価の高次バージョンは次のようになります。
型コンストラクターは、型引数(適切な型または型コンストラクター)に適用して適切な型(コンストラクター)を「構築」できる型です。
値コンストラクターは、適切な値(コンストラクター)を「構築」するために値引数(適切な値または値コンストラクター)に適用できる値です。
したがって、「高次」とは、単に「Xを超えて抽象化する」と言ったときに、本当にそれを意味するということです。のX
独自の「抽象化権」を失うことはありません以上の抽象化されている:それは抽象すべてのそれは望んでいます。(ちなみに、ここでは「abstract」という動詞を使用しています。値や型の定義に不可欠ではないものを除外することで、抽象化のユーザーが引数として変更/提供できるようにします。)
以下は、適切な1次および高次の値と型の例(電子メールによるLutzの質問に触発されたもの)です。
proper first-order higher-order
values 10 (x: Int) => x (f: (Int => Int)) => f(10)
types (classes) String List Functor
types String ({type λ[x] = x})#λ ({type λ[F[x]] = F[String]})#λ
使用されたクラスは次のように定義されました。
class String
class List[T]
class Functor[F[_]]
クラスの定義による間接化を回避するには、Scalaでは直接表現できない匿名型関数を何らかの形で表現する必要がありますが、構文オーバーヘッドをあまり発生させずに構造型を使用できます(#λ
-styleはhttps://stackoverflow.comによるものです) / users / 160378 / retronym afaik):
匿名型関数をサポートするScalaの仮想的な将来のバージョンでは、最後の行を例から次のように短縮できます。
types (informally) String [x] => x [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be
(個人的には、「種類の高い型」について話したことを後悔していますが、結局のところそれらは単なる型です。明確にする必要がある場合は、「型コンストラクター・パラメーター」、「型コンストラクター・メンバー」などと言ってください。 、または「型コンストラクタエイリアス」。適切な型についてだけ話しているのではないことを強調します。)
ps:さらに複雑にするために、「多態性」はForall T, T => T
多態性の値を分類するため、適切な型であるのような普遍的に数量化された型を意味する場合があるため、「多態性」は異なる方法で曖昧です。Scalaでは、この値は構造タイプとして書かれている{def apply[T](x: T): T = x}
)