Sì, sono supportate le classi di tipi a più parametri.
Un po 'confusamente, l'argomento Type
si riferisce alla intera istanza testa, e, anche se non è davvero un tipo, sembra abbastanza come uno sintatticamente che il tipo Type
è stato riutilizzato per questo scopo.
Pertanto, se si sta generando un multi-parametro instance Foo Int Bool
, è necessario utilizzare il "tipo" Foo Int Bool
, costruito per esempio come questo:
(ConT (mkName "Foo") `AppT` ConT (mkName "Int")) `AppT` ConT (mkName "Bool")
Ecco un esempio completo:
{-# 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))