2012-01-27 25 views
9

Birisi, fonksiyon kompozisyonunun tembelliğe bağlı olarak nasıl çalıştığına dair biraz açıklayabilir veya kaynak verebilir mi?tembellik ve işlev kompozisyonu (haskell, erlang)

Örneğin, filter (/='W') . map toUpper $ "justaword", Haskell'de, tembel olmayan erlang'daki karşılığıyla karşılaştırıldığında nasıl çalışır?

cevap

13

Her seferinde başka bir karakter (veya bitiş bildirimi) istendiğinde, bir sonraki karakter - eğer varsa - büyük harfle eşlenir, bu eşitsiz olarak iletilen "W" ile karşılaştırılır. take 1 gibi null gibi sorguları veya fonksiyonlar için, daha fazla iş yapılır böylece

filter (/= 'W') . map toUpper $ "justaword" 
~> filter (/= 'W') (toUpper 'j' : map toUpper "ustaword") 
~> filter (/= 'W') ('J' : map toUpper "ustaword") 
~> 'J' : filter (/= 'W') (map toUpper "ustaword") 

Şimdi ilk karakter mevcuttur. Tüketici tarafından daha fazla karakter talep edilirse, dizenin sonuna ulaşılana kadar tek tek üretilecektir. Örnek

:

Prelude Data.Char> take 10 . filter (/= 'W') . map toUpper $ repeat 't' 
"TTTTTTTTTT" 

repeat sonsuz listesi üretir, ama sürece sadece sınırlı bir kısmı tüketilir, hesaplama sonlu zamanda sona erer. Ancak, take 10 . filter (/= 'W') . map toUpper $ repeat 'w' sonlandırılmayacaktır, çünkü üretilen karakterlerin hiçbiri filter'u geçmez ve take 10'a ulaşır.

+0

Müthiş bir teşekkür için teşekkürler :) Bu kodu katı bir dille yazmak mümkün mü (tembellik simüle etmeden)? Ya da sıkı bir dernek içinde liste iki kez, bir kez harita için ve bir kez de filtreye geçecek, başlangıçtan başlayacak mı? – Adi

+1

@Adi: evet, iki liste geçişi olacak. Harita, süzgeçten geçirilen ve bir başka listeye daha dönecek olan ve – newacct

+5

başka bir listeye dönecek olan yeni bir ara liste döndürecektir. Sıkı (istekli, daha ziyade) bir dilde, aynı davranışı elde etmek için tembelliği simüle etmek gerekir. Bazı diller bunu diğerlerinden daha kolay hale getirir, daha çok erlang ya da F # 'da C'den daha fazlasını yapardım (ve C'yi bildiğim halde neredeyse hiç erlang veya F # :) olmasına rağmen. İki travers ya da istekli bir dilde olup olmadığı derleyiciye bağlıdır. Prensip olarak, filtre ve harita kaynaşabilir, ancak genel olarak derleyicinin haritalanmış işlevin saflığını kanıtlaması ve bunu yapabilmesi için filtre yüklemesi gerekir. Bu yüzden çoğu durumda iki geçişi bekliyorum, kanıt zor. –