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 Int
s, 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:
- Explicity
fcTest
28inline
Ara. 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
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.
C# Jenerik't kazandı Temsilci Tür...
Coq gibi olmayan turing tam bir dil pr...
Kısıtlamaları İzleme teknikleri...
Bir şekilde DZD yazın yazılan delikler...
Birden fazla kısıtlamaları ile genel y...