2012-09-03 11 views
14

otomatik füzyon bu tür performans üzerinde herhangi Araştırma kapsamına, Kayseri var mı öylesineAynı listede iki haritayı nasıl ayırabilirim?

unzip (map (\x -> (f x, g x)) xs) 

gibi ifade

(map f xs, map g xs) 

listede xs üzerinde iki traversals kaynaştırmak olabilir?

(döndürülen listelerden biri diğerinden önce tüketilen eğer burada bir boşluk sızıntısı oluşturmak için bir riski var ben alanından tasarruf daha xs üzerinde ekstra geçişi önlemede daha çok ilgileniyorum..)

Düzenleme: Aslında füzyonun gerçek bellek içi Haskell listelerine uygulanmasını istemiyor, bu dönüşümün, tüketicilerle unzip'un kaynaşmış olmasına bağlı olarak anlam ifade etmiyor olabilir. unzip'un sigorta yapabileceğini bildiğim bir ayarım var (bkz. "FlumeJava: kolay, verimli veri-paralel boru hatları").

+2

Henüz otomatik değil, yine de oldukça iyi: http://squing.blogspot.com/2008/11/beautiful-folding.html –

+1

Bu sigortaların bir sonucu başka bir şeyle sonuçlanmadıkça, çiftleri oluşturmanın ve bunları çıkarmanın yükünü kaldıracaklar. Ekstra traversalin maliyetinden daha büyük olmak. – augustss

+1

@augustss Geçiş büyük bir dosyanın üzerinde değilse! Bunu gerçek listelere uygulamayı düşünmüyorum. – tibbe

cevap

4

Ayrıca tam otomatik değil, ancak GHC'ye bunun gibi yeniden yazma kuralları listesi verebilirsiniz. 7.14 Rewrite rules ve Using rules'a bakın. Daha sonra derleyici, derleme sırasında programınızı optimize etmek için bu kuralları kullanır. (Hiçbir şekilde çekleri derleyici kuralları bir anlam eğer unutmayın.)

Düzenleme: bu özel sorun için bir örnek vermek gerekirse, biz yazabiliriz:

{-# OPTIONS_GHC -fenable-rewrite-rules -ddump-rule-firings -ddump-rule-rewrites #-} 

import Data.Char 

{-# RULES 
"map/zip" forall f g xs. (,) (map f xs) (map g xs) = unzip (map (\x -> (f x, g x)) xs) 
    #-} 

main :: IO() 
main = let x = "abCD" in 
     print $ (,) (map toUpper x) (map toLower x) 

(üst düzey kuraldaki işlev adı (,) :: a -> b -> (a, b)). Derlerken, kuralların nasıl uygulandığını göreceksiniz. Seçenek dump-rule-firings, bir kural uygulandığında ve -ddump-rule-rewrites her kural uygulamasını ayrıntılı olarak görüntülediğinde bir mesaj gösterir - bkz. 7.14.6. Controlling what's going on in rewrite rules.

Josef Svenningsson:

+0

Bu tür ifadelere uyacak bir kural yazabileceğimizi düşünmüyorum. GHC kuralları bir işlev adıyla başlamalıdır. – tibbe

3

Ben en azından kısaca füzyon (un-) bahseder fonksiyonları gibi zip iki kaynak bulmak başardınız. "Biriktirme Parametreleri & Sıkıştırma İşlevleri için Kısayol Füzyonu" http://www.cse.chalmers.se/~josefs/publications/fusion.pdf

Duncan Coutts. "Akış Füzyonu: Bağımlı dizi tipleri için pratik kısayol füzyonu"

Bu kaynaklardan hiçbiri açıkça "kardeşi kaynaştırma" dan söz etmez.

+1

Bu sunuyu görmedim, ama burada Josef'in [TupleFusion] hakkında slaytları var (http://wiki.portal.chalmers.se/cse/uploads/FP/Josef_TupleFusion.pdf). – danr

+0

[Otomatik bir çevirme stratejisine doğru] (http://dl.acm.org/citation.cfm?id=154643) ilginç olabilir. –

İlgili konular