SORU
22 HAZİRAN 2013, CUMARTESİ


Başlarken ilişkili bir tür şablon Haskell ile eş anlamlı

Şablon Haskell isimlerini bulabilir ve/veya ilişkili bir tür eş anlamlı tür bir sınıf içinde bildirilen bildirimleri? *4* ben ne istiyorum beklerdim, ama tüm gerekli bilgileri sağlamak için görünmüyor. Fonksiyon türü imza almak için çalışır:

% ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
...
Prelude> -- I'll be inserting line breaks and whitespace for clarity
Prelude> -- in all GHCi output.
Prelude> :set -XTemplateHaskell 
Prelude> import Language.Haskell.TH
Prelude Language.Haskell.TH> class C a where f :: a -> Int
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C)
ClassI (ClassD [] Ghci1.C [PlainTV a_1627398388] []
               [SigD Ghci1.f
                     (ForallT [PlainTV a_1627398388]
                              [ClassP Ghci1.C [VarT a_1627398388]]
                              (AppT (AppT ArrowT (VarT a_1627398388))
                                    (ConT GHC.Types.Int)))])
       []

Ancak, ilişkili bir tür sınıf eşanlamlı ekleyerek herhangi bir değişiklik (yeniden adlandırma) çıkış nedenleri:

Prelude Language.Haskell.TH> :set -XTypeFamilies 
Prelude Language.Haskell.TH> class C' a where type F a :: * ; f' :: a -> Int
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C')
ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] []
               [SigD Ghci3.f'
                     (ForallT [PlainTV a_1627405973]
                              [ClassP Ghci3.C' [VarT a_1627405973]]
                              (AppT (AppT ArrowT (VarT a_1627405973))
                                    (ConT GHC.Types.Int)))])
       []

Eğer F, adını biliyorum eğer bu konuda bilgi bakabilirim:

Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''F)
FamilyI (FamilyD TypeFam
                 Ghci3.F
                 [PlainTV a_1627405973]
                 (Just StarT))
        []

Ama ilk etapta F adını bulamıyorum. Eğer yazın sınıfının bir örneğini eklerseniz bile, InstanceD tanımı hakkında hiçbir bilgi vardır:

Prelude Language.Haskell.TH> instance C' [a] where type F [a] = a ; f' = length
Prelude Language.Haskell.TH> f' "Haskell"
7
Prelude Language.Haskell.TH> 42 :: F [Integer]
42
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C')
ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] []
               [SigD Ghci3.f'
                     (ForallT [PlainTV a_1627405973]
                              [ClassP Ghci3.C' [VarT a_1627405973]]
                              (AppT (AppT ArrowT (VarT a_1627405973))
                                    (ConT GHC.Types.Int)))])
       [InstanceD []
                  (AppT (ConT Ghci3.C')
                        (AppT ListT (VarT a_1627406161)))
                  []]

Eğer reify bir işe yaramayacak olursa, geçici bir çözüm var, yardımcı türünü el ile eşanlamlı liste dışında mı?

Bu sorun, şablon-haskell paketi sürüm 2.9.0.0 ile DZD 7.8.3 mevcuttur; ayrıca şablon-haskell paketi sürüm 2.7.0.0 ile DZD 7.4.2 mevcut. (7.6.* DZD kontrol etmedim ama orada mevcut olduğunu düşünüyorum.) DZD herhangi bir sürümü için çözümler ilgileniyorum ("bu sadece DZD giderilmiştir sürüm dahilV").

CEVAP
17 EYLÜL 2015, PERŞEMBE


Kimse talep nedeniyle uygulanmadı.

Garip olan şu İNCİ derleyicinin AST iç izlemiyor kendi AST kullanır. Sonuç olarak, herhangi bir yeni özellik (örneğin ilişkili bir tür aileler) İNCİ ile değil otomatik olarak kullanılabilir. Bazı biri bir bilet açmak ve uygulamak.

Başvuru için: reifyClassignores ilişkili bir tür aile (demet 5 öğe classExtraBigSig, ClassATItem. ayrıca tanımına bakın tarafından döndürülür) fonksiyonu

Teknik olarak bu kolay olmalı uygulamak için ilişkili bir tür aile Desteği reify, ama büyük olasılıkla olacak iste geriye dönük uyumsuz değişiklikleri İNCİ API, örneğin, çünkü onun AST gibi görünmüyor desteği ilişkili bir tür varsayılanları.

Ekledi:Şimdi implemented (API değişikliği btw olmadan) ve muhtemelen ghc sonraki sürümünde mevcut olacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ghosti66

    ghosti66

    27 AĞUSTOS 2006
  • Le Cargo !

    Le Cargo !

    24 HAZİRAN 2007
  • tsweeney79

    tsweeney79

    21 Ocak 2008