Bir programlama alıştırmasında, önce faktoriyel fonksiyonun programlanması ve daha sonra toplamı hesaplaması istendi: 1! + 2! + 3! +... n!
O(n)
çarpımlarında (bu yüzden faktörü doğrudan kullanamıyoruz). Çözümü bu özel (önemsiz) sorun için araştırmıyorum, Haskell yeteneklerini keşfetmeye çalışıyorum ve bu problem oynamak istediğim bir oyuncak.Haskell'in tembelliği Python jeneratörlerine zarif bir alternatif mi?
Python jeneratörleri bu problem için güzel bir çözüm olabilir diye düşündüm. Örneğin: Orada bu jeneratörün daha benzer bir davranışa sahip Haskell bir şey oldu ve ben tembellik herhangi bir ek kavram olmadan tüm personel yapmak düşündüm eğer
from itertools import islice
def ifact():
i , f = 1, 1
yield 1
while True:
f *= i
i += 1
yield f
def sum_fact(n):
return sum(islice(ifact(),5))
Sonra anlamaya çalıştık.
Örneğin,
fact = scan1 (*) [1..]
ile benim Python ifact değiştirmek Ve sonra aşağıdaki ile egzersiz çözebilir:
sum n = foldl1 (+) (take n fact)
ben bu çözüm Python'un birine gerçekten "eşdeğer" olup olmadığını merak Zaman karmaşıklığı ve bellek kullanımı ile ilgili. Haskell'in çözümünün, tüm unsurları bir zamanlar bir kez kullanıldığından asla saklayamayacağını söyleyebilirim.
Doğru veya tamamen yanlış mıyım?
DÜZENLEME: Ben daha doğrusu kontrol olmalıdır:
Prelude> foldl1 (+) (take 4 fact)
33
Prelude> :sprint fact
fact = 1 : 2 : 6 : 24 : _
Yani (benim uygulaması) Haskell artık kullanılmamaktadır olsa bile, sonucunu saklamak.
bazı benzerlikler, aynı zamanda bazı farklılıklar vardır: açıkça başka nesne saklayabilirsiniz sürece Python jeneratörler, daha önce ziyaret unsurlara erişme vermeyin. – pyon
Python tarzı jeneratörler en yakın analog (C#: 'IEnumerator', Pas:' Iterator', vb) Aklıma gelen Gabriel Gonzalez' mükemmel [borular] içinde Producer's 'kavramı, (http://hackage.haskell.org/package/pipes) kütüphanesi. – pyon
Bunların bir şekilde daha genel bir genelleme olduğunu söyleyebilirim, ancak Python'un jeneratörler de çok özel durumlarda oldukça hoş olan koroutinler olarak hareket edebilirler. – bheklilr