サーチ…


基本的な使用法

GADTs拡張が有効になっている場合、通常のデータ宣言の他に、次のように一般化された代数データ型を宣言することもできます。

data DataType a where
    Constr1 :: Int -> a -> Foo a -> DataType a
    Constr2 :: Show a => a -> DataType a
    Constr3 :: DataType Int

GADT宣言は、データ型が持つすべてのコンストラクタの型を明示的にリストします。通常のデータ型宣言とは異なり、コンストラクタの型は、最終的にいくつかの引数にデータ型が適用される結果となるN-ary(nullaryを含む)関数です。

この例では、 DataType型にConstr1Constr2Constr3 3つのコンストラクタがあると宣言していDataType

Constr1コンストラクターは、通常のデータ宣言を使用して宣言されたコンストラクターとConstr1 data DataType a = Constr1 Int a (Foo a) | ...

Constr2では、 aShowのインスタンスが必要であるため、コンストラクタを使用する場合はインスタンスが存在する必要があります。一方、パターンマッチングでは、 aShowインスタンスであるという事実が有効になるので、次のように書くことができます:

foo :: DataType a -> String
foo val = case val of
    Constr2 x -> show x
    ...

Show a constraintは関数の型には現れず、 ->右側のコードでしか見ることができません。

Constr3型を持つDataType Int型の値たびことを意味し、 DataType aあるConstr3 、それはすることが知られているa ~ Int 。この情報もパターンマッチで復元できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow