Daire haritasının Scala folklorunda böyle bir yeri hak edecek kadar güçlü olan yanı nedir?
for
dil referansındaki ifadeleri nasıl işlediğiyle ilgili bölümü okuyun . Bazı ipuçları verebilir.
Daire haritasının Scala folklorunda böyle bir yeri hak edecek kadar güçlü olan yanı nedir?
for
dil referansındaki ifadeleri nasıl işlediğiyle ilgili bölümü okuyun . Bazı ipuçları verebilir.
Yanıtlar:
Bu cümlenin arkasındaki mantık, yazacağınız çok sıkıcı if / then / else kodunu flatMap'e (ve diğer yüksek dereceli işlevlere) çağrılarla değiştirebilmenizdir.
Bu özellikle Seçenekler için geçerlidir (bkz. Http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Ama diğer monadlar için de geçerli (itiraf etmem gerekse de henüz detayları tam olarak anlamıyorum)
Bir işlev (veya bir dizi işlev) uygulamak istediğiniz ve her işlevin boş döndürebileceği bir koleksiyonunuzun olduğu durumu hayal edin. Gerçekte null kullandığınızda, kodunuz boş kontrollerle çözülecektir. Ancak değerler yerine Options'ı kullanırsanız, değerleri istenen işlevlerle düz bir şekilde eşleştirebilir, birden çok işlev durumunda işlevleri zincirleyebilir ve yalnızca boş olmayan sonuçları içeren bir koleksiyon elde edebilirsiniz; çoğu durumda tam olarak İstediğiniz.
Bu tanım oldukça karmaşık olduğundan, daha kısa tavsiye "sadece düz harita" kendini kanıtladı.
Duyduğum hikaye, iki önde gelen Scala programcısının, bunlardan biri aşağıdaki gibi bir kod yazmaya başladığında eşleştiğiydi:
option match {
case Some ...
Hangi noktada diğeri "Bu nedir? Amatör saat? Düz harita bu bok!" Dedi.
Neyin bu kadar güçlü olduğuna gelince flatMap
... Birincisi, temel monadik operatördür. Bu, örneğin kaplar ( Option
koleksiyonlar vb.), Devamlar, durum vb. Tarafından paylaşılan ortak bir işlem olduğu anlamına gelir . İkincisi, bir monadik işlemin Option
tersine flatMap
bir işlemin yapısını kaldırabilirsiniz. , bu nedenle yaygın olarak uygulanamaz. Ayrıca, işlediğiniz veriler hakkında çok fazla bilgi gerektirir.
Not: daha önce eşleştirmenin daha yavaş olduğunu söylemiştim flatMap
- aslında bu yazının yazıldığı sırada Scala'nın en son sürümü olan 2.10.1'e kadar doğrudur.)
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
. Daha fazla monad ekleyebilirim, monadları kaldırabilirim ve aynı kalır. Ayrıca, not o içine içine ayrıştırmak etmediğini String
, ancak içine Option[String]
. Gerçi, aslında, hiç ayrışmıyor. Bazı insanların konteynırları monadlara örnek olarak kullanmaktan hoşlanmamalarının nedenlerinden biri, konteynırlardan bir şeyler çıkarabilmenizdir, ancak tüm monadlar bunu yapmanıza izin vermez.
Önemli olan şey flatMap
, bunun Scala'nın monadik bağlama operasyonunu temsil etmesidir. Web'de monadların amacını ve tam olarak neden bu kadar yararlı olduklarını açıklayan çok sayıda eğitim var; James Iry'de ayrıntılara giren bir tane var.
Option
birçok flatMap
kullanım durumundan sadece biri . Elbette, monadları "doğal ortamlarında" gözlemlemek istiyorsanız, Haskell'e bir göz atmalısınız. Tek fark, Haskellers'ın "Sadece >> = bu bok!" Demesidir.
Runar Bjarnason, köken için aradığınız kişi.
Neden bu kadar güçlü olduğunun farkına varmak, dürüst olmak için yalnızca zamanla gelebilecek bir şeydir. Option sınıfı, bir dizi aramayı (örneğin) nihai bir sonuca nasıl tekrar tekrar düzleştireceğinizi görmek için başlamak için en iyi yerdir.