2012-11-11 4 views

cevap

10

Evet, çok parametreli tip sınıfları destekleniyor.

Biraz karışıklığa, Type argüman tek tip Type bu amaçla yeniden edildi sözdizimsel böyle gerçekten bir tür, bu yeterli görünüyor değil olsa bile, tüm örneği kafasına ifade eder ve.

(ConT (mkName "Foo") `AppT` ConT (mkName "Int")) `AppT` ConT (mkName "Bool") 

İşte tam bir örnek::

{-# 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)) 
Birden çok parametre instance Foo Int Bool alıp almadıklarını

nedenle, böyle örneğin inşa "türü" Foo Int Bool, kullanmak gerekir

6

Bunu ve benzerlerini yanıtlamanın kolay bir yolu, runQ eklenmiş tanımları kullanmaktır. GHCi içinde Ör:

$ 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)) []] 

Bu kullandığınız ne olursa olsun sınıf ile Class yerine, gerekli kesin şeklini gösterir.

İlgili konular