2012-02-08 15 views
6

İki işlevim var f :: [a] -> b ve g :: [a] -> c. Ben gerçekleştirirsenizSunulan vakanın tek döngüye göre optimize edilmesi mümkün mü?

  1. (f &&& g) xs nerede xs :: [a] ve her iki f ve g döngüler dahil eğer derleyici olarak bu iki döngüler optimize etmek için, bu mümkün: Ben şu iki soru var? (Bazı spesifik Haskell derleyicisi bu. Böyle bir şeyin mümkün olup olmadığını bilmek istiyorum uygulayıp uygulamadığını soran değilim unutmayın.)

  2. Traverse tip sınıfı yardımından traverse fonksiyonu bana böyle bir optimizasyon alabilirmiyim aşağıdaki satırlar boyunca bir şey: f ve g girdi listesinin farklı miktarlarda tüketmek çünkü

    traverse (someCombinator f g) xs 
    
+0

Sanırım, 1 gibi optimizasyonlar süper bileşenlerle gerçekleştirilebilir. – Landei

cevap

9

O bu kodu optimize etmek teorik olarak mümkündür, ancak çok çok zor. Sadece aynı miktarda tükettiklerinde veya g her zaman f'dan daha fazla liste tüketir (veya tersi), optimizasyonu gerçekleştirmek mümkün olur. Durma Sorunu, bir derleyicinin karmaşık kodda bu koşulları algılamasını engeller. Örneğin, yalnızca f ve g ve g'un foldr'u içsel olarak kullandığı basit durumlarda, örneğin, daha fazla iç gözlem olmaksızın önemsiz optimizasyonlar gerçekleştirmek mümkün olabilirdi. (Ciddi hacks bir [a] içine a 's birden çağrıları dönüştürmek istiyoruz Nasıl someCombinator uygulanması hiçbir makul bir yol yoktur çünkü

traverse fonksiyon, burada yardımcı olmaz? Ve nerede başladığını sonra geri vardır neyse).

Sizin tek gerçek seçenek onlar b ve c değeri aşamalı hesaplanabilir, yani imzalar f :: a -> b -> b ve g :: a -> c -> c sahip olacak şekilde, klasörler halinde f ve g yapmaktır. Daha sonra geleneksel (bu durumda sağda) katlamada kullanabileceğiniz bir klasör almak için \ a -> f a *** g a'u kullanabilirsiniz.

+0

Harika cevap. Çok teşekkürler! Bu soruyu yayınladım çünkü [bu konu] 'da söylediğimi kontrol etmek istedim (http://stackoverflow.com/questions/9162256/cartesian-product-traverse-in-scalaz/9162706#9162706) (hem yorumlarda) doğruydu. – missingfaktor

İlgili konular