2012-11-11 13 views

答えて

10

はい、複数パラメータタイプのクラスがサポートされています。

はやや紛らわしい、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)) 
6

これに似た簡単な方法は、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を交換してください。

関連する問題