Ja, Multiparameter-Klassen werden unterstützt.
Etwas verwirrend, das Type
Argument bezieht sich auf die gesamte Instanz Kopf, und, auch wenn es sich um eine Art nicht wirklich vor sich, es genug sieht aus wie ein syntaktisch, dass der Typ Type
für diesen Zweck wiederverwendet wurde.
Deshalb, wenn Sie einen Multi-Parameter-instance Foo Int Bool
zu erzeugen, müssen Sie den "Typ" verwenden Foo Int Bool
, beispielsweise wie folgt aufgebaut:
(ConT (mkName "Foo") `AppT` ConT (mkName "Int")) `AppT` ConT (mkName "Bool")
Hier ist ein komplettes Beispiel:
{-# 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))