Scala'daki “düz harita” nın deyimsel ifadesi nereden geliyor?


104

Daire haritasının Scala folklorunda böyle bir yeri hak edecek kadar güçlü olan yanı nedir?


30
[kaynak belirtilmeli]
tstenner

1
Derleyicinin fordil referansındaki ifadeleri nasıl işlediğiyle ilgili bölümü okuyun . Bazı ipuçları verebilir.
Dirk

@tstenner: Kısa memlere dayandığımız sürece: Google senin arkadaşın.
Chuck

4
@aishwarya Daha çok "Listenizde / dizinizde / seçeneğinizde düz haritayı kullanın" gibi, "kötü" deki gibi "bok" değil
tstenner

1
Aslında, bu belirli cümle (elbette) bağlamından çıkarıldı, burada birisi Manhattan'da bir yerde Bar (Okuyucu) monadını kaçırdı ;-) Bu gibi durumlarda olduğu gibi, kısa versiyon takılı kaldı.
Roland Kuhn

Yanıtlar:


55

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ı.


Bazen kombinasyonlarla başa çıkmak için liste monadını kişisel olarak kullanıyorum.
Dan Burton

103

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 ( Optionkoleksiyonlar vb.), Devamlar, durum vb. Tarafından paylaşılan ortak bir işlem olduğu anlamına gelir . İkincisi, bir monadik işlemin Optiontersine flatMapbir 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.)


4
Sanırım hala amatör saatindeyim o zaman :-)
Guillaume Belrose

69
O iki programcı ben ve Paul Chiusano idi.
Apocalisp

1
Doğru hatırlıyorsam, #legendofklang aynı anda Twitter'da kendini göstermiyor muydu ... bu genellikle düz haritanın yanlış atıfta bulunmasının köküdür. Bir çeşit Scala meme wiki girişi yapmalıyız; şimdi bazı harika olanlar var!
timothy

3
@WillSargent Sanırım ağaçlar için ormanı özlüyorum. Avantajı olduğunu oluşturan . Dört monada bağlı bir fonksiyonum varsa yazabilirim 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.
Daniel C. Sobral

1
Burada alıntı yapılan tartışmanın bağlantısını görebilirsiniz: web.archive.org/web/20130627111326/http://beust.com/weblog/2010/…
hawkeye

12

Ö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.


4
Bence bu doğru cevap, Optionbirçok flatMapkullanı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.
Landei

Makalenin bağlantısı için teşekkürler, çok faydalı buldum. Ayrıca, döngülere ve bunların filtre, harita, flatMap ve düzleştirme kullanımlarına biraz ışık tutan Scala'da Programlama'daki "Yeniden ziyaret edilen ifadeler" bölümüne geri döndüm.
Guillaume Belrose

10

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.