何かのためにDSum
を使用したいと思います。 DSum
を使用するには、1つの型引数をとる 'タグ'型が必要です。このデータ型を他のデータ型からプログラムでどのように生成できますか?
data Tag a where
AFirst :: Tag Int
ASecond :: Tag String
しかし、これをライブラリで内部的に使用したいと思います。私はユーザーに古いデータ型を取ることを暴露するインターフェースを望んでいます。
data SomeUserType1 = Foo Int | Bar String
これは、上記のTag a
タイプに移行するのは明らかにかなり機械的です。ですから、何らかの汎用プログラミング技術を使ってコードでこれを行うことは可能でしょうか?
ここでは、作成したいマッピングのタイプについてもう1つの例を示します。
data SomeUserType2 = Foo Int | Bar Char | Baz Bool String
は
data Tag2 a where
AFirst :: Tag2 Int
ASecond :: Tag2 Char
AThird :: Tag2 (Bool, String)
になるべきこのテンプレートHaskellのための仕事ですか?他に何か?私は実際にオプションが何であるか本当に知りません。
@JonPurdy私は強く反対です! THだけが宣言を作成できます。 'ジェネリックス'と 'データ'は、デフォルトのインスタンスを作るようなもののためにほとんど役に立ちます。 – Alec
@Alec:D'oh!私は自分自身を見ているだけです。 –