SORU
12 Ocak 2014, Pazar


Kısıtlamaları ile ihtisas

Sorunları sınıf bir kısıtlama ile bir fonksiyon uzmanlaşmak DZD yaşıyorum. Benim sorunum burada en az bir örnek var: Foo.hs Main.hs. İki (7.6.2, ghc -O3 Main DZD) derlemek ve çalıştırmak dosyaları.

NOT: Foo.hs çok şeritli. Eğer kısıtlama tabi neden görmek istiyorsanız, biraz daha fazla kod here görebilirsiniz. Tek bir dosya içinde ben ya da diğer birçok küçük değişiklikler yaparsanız, DZD sadece plusFastCyc çağrı inlines. Bu INLINE işaretli bile plusFastCyc DZD içi için çok büyük olduğu için gerçek kodu, ne olacak değil. NoktauzmanımplusFastCyc, içi için arayın. plusFastCyc böyle büyük bir fonksiyonu çoğaltarak eğer bunu DZD zorlayabilirim bile hos olurdu yani gerçek kod birçok yerde denir.

Faiz kod Foo.hs, burada yeniden plusFastCyc:

{-# INLINEABLE plusFastCyc #-}
{-# SPECIALIZE plusFastCyc :: 
         forall m . (Factored m Int) => 
              (FastCyc (VT U.Vector m) Int) -> 
                   (FastCyc (VT U.Vector m) Int) -> 
                        (FastCyc (VT U.Vector m) Int) #-}

-- Although the next specialization makes `fcTest` fast,
-- it isn't useful to me in my real program because the phantom type M is reified
-- {-# SPECIALIZE plusFastCyc :: 
--          FastCyc (VT U.Vector M) Int -> 
--               FastCyc (VT U.Vector M) Int -> 
--                    FastCyc (VT U.Vector M) Int #-}

plusFastCyc :: (Num (t r)) => (FastCyc t r) -> (FastCyc t r) -> (FastCyc t r)
plusFastCyc (PowBasis v1) (PowBasis v2) = PowBasis $ v1   v2

Main.hs dosyası var iki sürücü: vtTest, çalışır ~3 saniye, ve fcTest, çalışır ~83 saniye derlenmiş-O3 kullanarak forall'd uzmanlık.

core shows o vtTest test, ayrıca kodudur olmak için özel Unboxed vektörler Ints, vs, öte yandan sıradan vektör kod kullanılır fcTest. Hat üzerinde 10, DZD hat üzerinde genel bir sürüme göre plusFastCyc, özel bir sürümü yazmak yok olduğunu görebilirsiniz 167. Uzmanlık için kural hattı 225. Bu kural hattı 270 ateş gerektiğine inanıyorum. (main6 iterate main8 y, main8 plusFastCyc özel olması gereken yerde öyle diyor.)

Amacım fcTest vtTest hızlı plusFastCyc uzmanlaşarak yapmaktır. Bunu yapmak için iki yol buldum:

  1. Explicity fcTest 28 inline Ara.
  2. plusFastCyc Factored m Int kısıtlamasını kaldırın.

Seçenek 1 gerçek kod tabanı plusFastCyc sık kullanılan bir işlem olduğu için yetersiz ve birçokbüyük işlevi, her kullanımda inlined olmamalı. Daha doğrusu, DZD plusFastCyc özel bir sürümü aramalı. Seçenek 2 gerçek kod kısıtlaması ihtiyacım olduğu için bir seçenek değil.

Seçenekler (ve kullanma) INLINE, INLINABLE SPECIALIZE kullanarak çeşitli denedim ama hiçbir şey iş gibi görünüyor. (EDİT: plusFastCyc çok fazla benim örnek küçük yapmak şeritli olabilir, INLINE işlevi inlined neden olabilir. Bu plusFastCyc çok büyük olduğu için benim gerçek kod olmuyor.) Bu örnekte, örnek minimize önce match_co birçok uyarılar alıyordum ama match_co: needs more cases RULE: LHS too complicated to desugar (here) herhangi bir uyarı alıyorum. Muhtemelen, "sorun kuralı Factored m Int sınırlamadır; eğer bu tabloda bir değişiklik yaparsam", fcTest hızlı vtTest olarak çalışır.

DZD gibi değil bir şey yapıyor muyum? Neden DZD plusFastCyc uzman değil ve bunu nasıl yapabilirim?

GÜNCELLEME

Sorun 7.8.2, bu soru hala geçerlidir çok DZD devam etmektedir.

CEVAP
12 Mart 2009, PERŞEMBE


Zaten ilan ettik gerçekten temiz. Eğer ekstra özelliği beğenmedin varsa, IXmlSerializable, uygulamak olabilir ama yapmak zorundasınher şeyibüyük ölçüde nokta yendi., Mutlu yayınladığınızı yaklaşım kullanmak istiyorum; (örneğin) etkilidir (karmaşık ayrıştırma vb.), kültür bağımsız, anlaşılır ve zaman damgası-sayıları kolay ve yaygın olarak anlaşılır.

Bir kenara olarak, ben sık sık ekleyin:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]

Bu sadece referans DLL UI ve karışıklığı önlemek için gizler.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • dcigs

    dcigs

    9 EYLÜL 2006
  • STITCHLESS TV how to sew your own style tutorials

    STITCHLESS T

    9 HAZİRAN 2011
  • Wii Minute Radio

    Wii Minute R

    31 Mayıs 2008