2011-07-22 15 views
17

Haskell'de Iteratee based I/O çok çekici görünüyor. Yinelemeler, işlevsel dillerdeki 'kat' a.k.a. 'azaltma' işlevinden esinlenerek I/O yapmanın bir bileşimi, güvenli, hızlı bir yoludur. Temel olarak, eğer bir geçişiniz varsa, bu durum, geçiş durumunu bir "değer" olarak adlandırılan bir "numaralayıcı" olarak adlandırılan bir "sayımcı" olarak kapsülleyecek ve bu da bir değer ya da bir devam ile birlikte daha fazla veri için bir talep döndürecektir. çağrı yapacak kişi için. Dolayısıyla, sadece sayımcı geçişin durumunu bilir, yineleyici ise verilerle ne yapılacağını bilir ve değerlerini ortaya çıkarır. Bunun en güzel yanı iteratların otomatik olarak birleştirilebilir olmasıdır, bir iteratın çıktısı daha büyük olanı yapmak için diğerine beslenir.Yineleme I/O, işlevsel olmayan dillerde anlam ifade eder mi?

Yani, iki soru:

  • kavram bile düz nesne yönelimli diller gibi, diğer dillerde lemeyece¤ini yapıyor mu

    yoksa O/Haskell'ın tembel I eksikliklerini aşmak için sadece yararlıdır?
  • Diğer diller için, özellikle C# (şirketimin kullandığı gibi) için gerçek uygulamalar var mı? (Bir google araması, Scala'daki yinelemelerden bahseder; şu anda Scala ile ilgilenmiyorum). Her şeyden
+0

Temel olarak C# 5.0'deki yeni async şeyleri ne için tasarlandı? Mekanizma farklıdır, ancak temelde yatan uygulama temel olarak bir devamıdır. –

+0

Bunu işaret ettiğin için teşekkürler - Henüz bunu bilmiyordum ve kesinlikle heyecan verici görünüyor, bu yüzden içine bakmak zorundayım, gerçi gerçekten çok fazla şey göremiyorum, yinelemelerde ortak. ;-) – firefrorefiddle

cevap

8
+0

İlk bakışta görebildiğim kadarıyla, haklısınız! Teşekkürler, onlara bakacağım. – firefrorefiddle

+0

Henüz bitmemiş bir uygulama var. Temel yapıyı gösterir. https://gist.github.com/4025522. Gözlemcinin gözlemlenebilir olanlara mesaj gönderemeyeceği bir fark vardır (sadece IDEposable ile Aboneliği iptal et) ancak yineleyici numaralandırıcıya mesaj gönderebilir. –

8

Birincisi, Haskell "Tembel IO" verileri lazily tüketilen olarak G/Ç talebine gerçekleşmesini sağlamak için sınırlı bir şekilde saflığı bozan bir hack tür olduğunu biliyoruz. Bu, her zamanki gibi saf olmayan bir dilde iştir ve tembel diziler her yerde aynı sorunu yaratabilir. Yani, bir dosya için IEnumerable arabirimini açığa çıkarma ve dizinin numaralandırılmasıyla aşamalı olarak okuma gibi bir şey yapıyorsanız, bu gerçekten farklı değildir. İkinci olarak, yineleyiciler ve sayımcılar aynı zamanda (biraz sakar şekilde) numaralandırıcılar olarak adlandırılanlar halinde de oluşturulabilirler. Bu noktada, sıralı verilerle beslenen, hazır oldukları sırada artan sonuçlar üreten ve bu sonuçları başka bir şeye besleyen bir şey var. Bu temelde çeşitli akış işlemcisi, muhtemelen hem Haskell hem de C# 'yı hatırı sayılır bir marjla ön plana çıkaran bir konsept.

Üçüncüsü, yinelemeler, iç işleyişlerinin gizlenmesiyle, soyutlanmış davranışların bir kapsüllenmesidir. Bu, OO prensiplerine uygun olarak, ML-tarzı fonksiyonel programlamaya göre, en azından "OO prensipleri" anlamında, alıcılar ve ayarlayıcılar kullanmak için size seslenen kişiler tarafından benimsenen ve kontrol akışının polimorfizmi. Yukarıdaki gibi göz önüne alındığında, yinelemeli kavramın C# 'ye çok uygun olduğunu ve doğal olarak, veri akışı nesneleri ve bir "itme" arayüzü ile, IEnumerable bir ters eşdeğer eşdeğeri olarak uygulanacağını söyleyebilirim. standart LINQ'nun "çekme" tarzı yerine. Ben Tarif ettiğiniz anlıyorsa

+0

Harika bir açıklama için teşekkürler! – firefrorefiddle

+0

@Mike Hartl: Değeri için Reaktif Uzantılar hakkında unutmuştum; Charles’ın bağlantısına baktıktan sonra, açıkladığımla aynı çizgide oldukça açık bir şekilde vermişti. –

İlgili konular