Haskell Language
役割
サーチ…
前書き
TypeFamilies
言語拡張により、プログラマーは型レベル関数を定義することができます。タイプファンクションと非GADTタイプのコンストラクタを区別する点は、タイプファンクションのパラメータはノンパラメトリックであるのに対し、コンストラクタ型のパラメータは常にパラメトリックであることです。この区別は、 GeneralizedNewTypeDeriving
拡張の正しさにとって重要です。この区別を説明するために、Haskellに役割が導入されています。
備考
SafeNewtypeDeriving
も参照してください。
名目上の役割
Haskell Wikiには、型関数の非パラメトリックパラメータの例があります:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
ここで、 x
は非パラメトリックです。なぜなら、型引数にInspect
を適用した結果を判断するためには、型関数がx
検査しなければならないからです。
この場合、 x
の役割は名目上のものです。 RoleAnnotations
拡張で明示的にロールを宣言できます。
type role Inspect nominal
代表的な役割
型関数のパラメトリックパラメータの例:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
DoNotInspect
を型引数に適用した結果を判定するために、型関数はx
を検査する必要がないため、 x
はパラメトリックです。
この場合、xの役割は表現的です。 RoleAnnotations
拡張で明示的にロールを宣言できます。
type role DoNotInspect representational
ファントムの役割
ファントム型のパラメータには、ファントムの役割があります。ファントムの役割を明示的に宣言することはできません。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow