Iteratee - Iteratee

İçinde fonksiyonel programlama, bir yineleme bir birleştirilebilir soyutlama sıralı olarak sunulan girdi verisi yığınlarını bir tamamen işlevsel moda. Yinelemeler ile, bir kaynağın veriyi nasıl yayacağını tembel bir şekilde dönüştürmek mümkündür, örneğin, girişin her bir parçasını alınırken büyük harfe dönüştürerek veya verileri, tüm girdi verilerini yüklemeden yalnızca ilk beş parçayla sınırlandırarak hafıza. Yinelemeler ayrıca öngörülebilir kaynak yönetimi sağlayan kaynakların açılması ve kapatılmasından da sorumludur.

Her adımda, bir yineleme, üç olası değer türünden biri ile sunulur: sonraki veri yığını, veri olmadığını gösteren bir değer veya yineleme işleminin bittiğini gösteren bir değer. Arayan kişiye bundan sonra ne yapılması gerektiğini belirtmek için olası üç değer türünden birini döndürebilir: "durdur" anlamına gelen (ve son dönüş değerini içeren), "devam" anlamına gelen (ve nasıl devam edileceğini belirten) ve "bir hata sinyali" anlamına gelen bir tane. Etkili olan ikinci değer türleri, bir yinelemenin olası "durumlarını" temsil eder. Bir yineleme, genellikle "devam" durumunda başlar.

Yinelemeler kullanılır Haskell ve Scala (içinde Oyun Çerçevesi[1] ve Scalaz ) ve ayrıca şunlar için de mevcuttur: F #.[2] Çok az farklı yineleme uygulamaları mevcuttur. Örneğin, Play çerçevesinde şunları içerirler: Vadeli işlemler böylece eşzamansız işlem gerçekleştirilebilir.

Yinelemeler, onları verilerle besleyen başka bir kod tarafından çağrıldığından, kontrolün tersine çevrilmesi. Bununla birlikte, kontrolün tersine çevrilmesinin diğer birçok örneğinden farklı olarak, örneğin SAX XML ayrıştırma, yineleme işlemi üzerinde sınırlı miktarda denetim sağlar. Geri döndüremez ve önceki verilere bakamaz (bu verileri dahili olarak saklamadığı sürece), ancak herhangi bir veri atmadan süreci temiz bir şekilde durdurabilir. istisna (istisnaları bir araç olarak kullanmak kontrol akışı istisnai bir olayı işaret etmekten çok, programcılar genellikle hoş karşılanmaz[3]).

Yaygın olarak ilişkili soyutlamalar

Aşağıdaki soyutlamalar yinelemelerle çalışmak için kesinlikle gerekli değildir, ancak daha uygun hale getirirler.

Numaralandırıcılar

Bir Numaralandırıcı keyfi bir veri kaynağından bir yinelemeye veri beslemek için uygun bir soyutlamadır. Tipik olarak numaralandırıcı, veri kaynağıyla ilişkili gerekli kaynak temizliğini üstlenir. Numaralandırıcı, yinelemenin verileri okumayı tam olarak ne zaman bitirdiğini bildiğinden, kaynak temizliğini (bir dosyayı kapatmak gibi) tam olarak doğru zamanda - ne çok erken ne de çok geç yapacaktır. Ancak, bunu yinelemenin uygulanması hakkında bilgi sahibi olmaya veya birlikte konumlandırmaya gerek kalmadan yapabilir - böylece numaralandırıcılar ve yinelemeler bir örnek oluştururlar. endişelerin ayrılması.

Numaralandırılanlar

Bir Numaralandırılan bir numaralandırıcının veya yinelemenin çıktısını dönüştürmek ve bu çıktıyı bir yinelemeye beslemek için uygun bir soyutlamadır. Örneğin, bir "harita" numaralandırıcı, harita her girdi parçası üzerinde bir işlev.[4]

Motivasyonlar

Mevcut sorunlar nedeniyle yinelemeler oluşturuldu tamamen işlevsel yapım sorununa çözümler giriş çıkış düzenlenebilir ama doğru. Haskell'deki tembel G / Ç, saf işlevlerin diskteki veriler üzerinde bellekteymiş gibi, dosyayı açtıktan sonra açıkça G / Ç yapmadan çalışmasına izin verdi - bir tür bellek eşlemeli dosya özellik - ancak genel olarak imkansız olduğu için (çünkü Durma sorunu ) çalışma zamanının dosyanın veya başka bir kaynağın hala gerekli olup olmadığını bilmesi için, aşırı sayıda dosya gereksiz yere açık bırakılabilir ve sonuçta dosya tanımlayıcı yorgunluk işletim sistemi seviyesi. Geleneksel C -tipi G / Ç ise çok düşük seviyedeydi ve geliştiricinin dosyadaki mevcut konum gibi düşük seviyeli ayrıntılarla ilgilenmesini gerektiriyordu, bu da birleştirilebilirliği engelliyordu. Yinelemeler ve numaralandırıcılar, tembel G / Ç'nin yüksek düzeyli işlevsel programlama avantajlarını, gerektiğinde C tarzı G / Ç tarafından sağlanan kaynakları ve düşük düzeyli ayrıntıları kontrol etme becerisiyle birleştirir.[5]

Örnekler

Kullanımlar

Yinelemeler, verileri uzun süreli kullanıma aktarmak için Play çerçevesinde kullanılır Kuyruklu yıldız ve WebSocket bağlantıları internet tarayıcıları.

Yinelemeler, artımlı gerçekleştirmek için de kullanılabilir ayrıştırma (yani, tüm verileri bir kerede belleğe okumayan ayrıştırma), örneğin JSON.[6]

Bununla birlikte, yinelemelerin çok genel bir soyutlama olduğunu ve keyfi türler için kullanılabileceğini belirtmek önemlidir. ardışık bilgi işleme (veya karışık sıralı / rastgele erişimli işleme) - ve herhangi bir G / Ç içermesi gerekmez. Bu, bir yinelemenin ağdan veri akışı yerine bellek içi veri kümesi üzerinde çalışacak şekilde yeniden tasarlanmasını kolaylaştırır.

Tarih

Bir bakıma, verileri bir veya daha fazla yinelemeden oluşan bir zincire iten bir numaralandırıcı fikrinin uzak bir öncülü, boru hattı işletim sistemlerinde kavram. Bununla birlikte, tipik bir ardışık düzenden farklı olarak, yinelemeler ayrı süreçler değildir (ve bu nedenle, IPC ) - veya hatta ayrı iş parçacıkları, ancak birbirlerine mesaj gönderen bir işçi iş parçacığı zincirine benzer şekilde çalışabilirler. Bu, yinelemelerin süreçlerden veya iş parçacıklarından daha hafif olduğu anlamına gelir - ayrı işlemler veya iş parçacıkları içeren durumların aksine, fazladan yığınlara gerek yoktur.

Yinelemeler ve numaralandırıcılar tarafından icat edildi Oleg Kiselyov Haskell'de kullanım için.[5] Daha sonra, Scalaz'a (5.0 sürümünde; numaralandırmalar yoktu ve Scalaz 7'de tanıtıldı) ve Play Framework 2.0'a tanıtıldılar.

Biçimsel anlambilim

Yinelemeler resmi olarak şu şekilde modellenmiştir: ücretsiz monadlar eşitlik yasalarının doğrulanmasına ve yinelemeleri kullanarak programları optimize etmek için kullanılmasına izin verir.[5]

Alternatifler

  • Scala'da yinelemeler yerine yineleyiciler kullanılabilir, ancak bunlar zorunlu öyle değil tamamen işlevsel çözüm.
  • Haskell'de Kondüitler ve Borular olarak bilinen iki alternatif soyutlama geliştirilmiştir. (Bu Borular işletim sistemi düzeyindeki borular değildir, bu nedenle yinelemeler gibi bunların kullanılmasını gerektirmezler. sistem çağrıları ). Özellikle kanallar, yinelemelere göre önemli ölçüde daha zengin ilkel kitaplıklar ve birleştiricilerle ilişkilidir; HTML, XML ayrıştırma, genelleştirilmiş ayrıştırma, HTTP istekleri yapma ve yanıtları işleme gibi artımlı işlevler için kanal bağdaştırıcıları mevcuttur, bu da kanalları Haskell'de endüstriyel yazılım geliştirme için yinelemelerden daha uygun hale getirir.
  • Ayrıca adında üst düzey bir soyutlama var makineler. Scala'da adında bir paket var FS2: Scala için İşlevsel Akışlar, ataları çeşitli bağlantı noktaları, yeniden adlar ve yeniden düzenleyiciler aracılığıyla makinelere kadar izlenebilen.
  • Haskell'de paket güvenli tembel var. Aynı sorunlardan bazılarına daha basit bir çözüm sağlar, bu da gerekli olan veya gerekli olabilecek tüm verileri tamamlandığında kaynakları temizlemeyle ilgilenen bir boru hattından çekmek için "yeterince katı" olmayı içerir.

Referanslar

  1. ^ "Veri akışlarını reaktif bir şekilde işleme". Play Framework belgeleri. Alındı 29 Haziran 2013.
  2. ^ "Github Arama Sonuçları: FSharpx'te Iteratee".
  3. ^ "Java teorisi ve pratiği: İstisnalar tartışması". IBM developerWorks. Alındı 17 Mayıs 2014.
  4. ^ "Numaralandırılanlar". Çerçeve belgelerini oynatın. Alındı 29 Haziran 2013.
  5. ^ a b c Kiselyov, O. (2012). "Yinelemeler". Fonksiyonel ve Mantıksal Programlama. Bilgisayar Bilimlerinde Ders Notları. 7294. s. 166–181. doi:10.1007/978-3-642-29822-6_15. ISBN  978-3-642-29821-9.
  6. ^ James Roper (10 Aralık 2012). "Json.scala". play-iteratees-ekstralar. Alındı 29 Haziran 2013.

daha fazla okuma

Dış bağlantılar