Haskell Language
一般化された代数データ型
サーチ…
基本的な使用法
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型にConstr1 、 Constr2 、 Constr3 3つのコンストラクタがあると宣言していDataType 。
Constr1コンストラクターは、通常のデータ宣言を使用して宣言されたコンストラクターとConstr1 data DataType a = Constr1 Int a (Foo a) | ...
Constr2では、 aはShowのインスタンスが必要であるため、コンストラクタを使用する場合はインスタンスが存在する必要があります。一方、パターンマッチングでは、 aがShowインスタンスであるという事実が有効になるので、次のように書くことができます:
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