Dec
için son (2.8.0.0) tanımı, aşağıdaki örnek kurucu sahiptir. Bu etrafında çalışmak için bir yolu var mı?Şablon Haskell, çok paramli yazım örnekleri oluşturabilir mi?</p> <pre><code>InstanceD Cxt Type [Dec] </code></pre> <p>yalnızca tek bir tip örneklenebilmektedir görünüyor:
5
A
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.