サーチ…


前書き

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