Dec
の最新(2.8.0.0)の定義は、以下のインスタンスコンストラクタを持っていますTemplate Haskellはマルチパラメタ型インスタンスを生成できますか?
InstanceD Cxt Type [Dec]
は、一種類のみをインスタンス化することができるようです。これを回避する方法はありますか?
Dec
の最新(2.8.0.0)の定義は、以下のインスタンスコンストラクタを持っていますTemplate Haskellはマルチパラメタ型インスタンスを生成できますか?
InstanceD Cxt Type [Dec]
は、一種類のみをインスタンス化することができるようです。これを回避する方法はありますか?
はい、複数パラメータタイプのクラスがサポートされています。
はやや紛らわしい、Type
引数が1種類Type
は、この目的のために再利用した文法的にそのように、それは本当に種類が、それは十分に見えていないにも関わらず、全体のインスタンスヘッドを指し、そして。このように、たとえば構築
あなたはマルチパラメータinstance Foo Int Bool
を生成している場合ので、あなたは「タイプ」Foo Int Bool
を使用する必要があり、:
(ConT (mkName "Foo") `AppT` ConT (mkName "Int")) `AppT` ConT (mkName "Bool")
はここで完全な例です:
{-# LANGUAGE MultiParamTypeClasses, TemplateHaskell #-}
import Language.Haskell.TH
class Foo a b where
foo :: (a, b)
$(return [InstanceD [] (((ConT (mkName "Foo")) `AppT` ConT (mkName "Int")) `AppT` ConT (mkName "Bool"))
[ValD (VarP (mkName "foo"))
(NormalB (TupE [LitE (IntegerL 42), ConE (mkName "False")])) []]])
main = print (foo :: (Int, Bool))
これに似た簡単な方法は、runQ
にスプライスされた定義を使用することです。 GHCiの中例:
$ ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
Prelude> :set -XTemplateHaskell
Prelude> :set -XMultiParamTypeClasses
Prelude> import Language.Haskell.TH
Prelude Language.Haskell.TH> class Class a b where
Prelude Language.Haskell.TH> runQ [d| instance Class Int Bool where |]
[InstanceD [] (AppT (AppT (ConT :Interactive.Class) (ConT GHC.Types.Int)) (ConT GHC.Types.Bool)) []]
これは、必要な正確な形式を示し、使用しているものは何でもクラスでClass
を交換してください。