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