私は Template Haskell を使い始めたばかりで (ようやくユースケースを手に入れました!)、今は認知的に立ち往生しています。
私がやろうとしているのは、フォームのシングルトンデータ型宣言を生成することです
data $V = $V deriving (Eq,Ord)
名前からV
始めます (できれば大文字で始めてください!)。明確にするために、私はdeclareSingleton
スプライスString -> DecsQ
が
$(declareSingleton "Foo")
と同等です
data Foo = Foo deriving (Eq,Ord)
次のコードが機能し、必要なことを実行していますが、あまり満足していません。
declareSingleton :: String -> Q [Dec]
declareSingleton s = let n = mkName s in sequence [
dataD (cxt []) n [] [normalC n []] [''Eq,''Ord]
]
次のようなものが機能することを望んでいました。
declareSingleton :: String -> Q [Dec]
declareSingleton s = let n = mkName s in
[d| data $n = $n deriving (Eq,Ord) |]
$s
、$v
、$(conT v)
、v
のさまざまな組み合わせを試してみましたが、役に立ちませんでした (ただし、すべてを網羅しているわけではありません!) 'v
。
ここで明らかな何かが欠けていますか? 本質的な方法で型名とコンストラクター名を混同してdeclareSingleton
いませんか?
もしそうなら、どのように; そうでない場合、なぜですか?
(余談: Template Haskell API は急速に変化します。私はそれを喜んでいます。この単純な型に、関連付けられた型ファミリを持つマルチパラメーター型クラスを最終的に実装してもらいたいのですが、API が現在経験している変化はそうではありません。チュートリアルを簡単に検索できます! 6.12.1 または 7.2 での TH の実装方法 (既存のチュートリアルのほとんどが作成されたとき) と、現在の動作方法には大きな違いがあります...)