Template Haskell能否生成多参数typeclass实例?

Template Haskell能否生成多参数typeclass实例?,haskell,template-haskell,Haskell,Template Haskell,Dec的最新(2.8.0.0)定义具有以下实例构造函数: InstanceD Cxt Type [Dec] 似乎只能实例化一种类型。有办法解决这个问题吗?是的,支持多参数类型类 有点令人困惑的是,类型参数引用了整个实例头,并且,即使它不是一个真正的类型,但它在语法上看起来足够像一个类型,类型被重用用于此目的 因此,如果要生成多参数实例Foo Int Bool,则需要使用“type”Foo Int Bool,例如如下所示: (ConT (mkName "Foo") `AppT` ConT (mk

Dec
的最新(2.8.0.0)定义具有以下实例构造函数:

InstanceD Cxt Type [Dec]

似乎只能实例化一种类型。有办法解决这个问题吗?

是的,支持多参数类型类

有点令人困惑的是,类型参数引用了整个实例头,并且,即使它不是一个真正的类型,但它在语法上看起来足够像一个类型,
类型
被重用用于此目的

因此,如果要生成多参数实例Foo Int Bool,则需要使用“type”
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