2016-05-01 30 views
6

Aşağıdaki kodu anlamaya çalışıyorum ama yapamıyorum. Varsa, bir Etkinlik için bir çocuk oyuncunun yaratılması gerekir, aksi takdirde Etkinliğin bir çocuk oyuncağı kadar var olduğunu söyler.Scala katlama nasıl çalışır?

context.child (isim) .fold (create()) (_ => gönderen()! EventExists)

Ama burada katlama bana mantıklı değil. Context.child emtpty ise yaratılışı elde ederiz ve bunu anlıyorum. Ancak, eğer çocuk varsa, neden hala oluşturacağız? Eğer Option sitesindeki scaladoc görebileceğiniz gibi

cevap

7

AKKA en child döner bir Option

:

kat [B] (ifEmpty: ⇒ B) (f: (A) B ⇒): B Scala.Option değeri ise, bu scala.Option değerine f uygulayarak sonucunu döndürür. Aksi takdirde, ifadesini değerlendirirseEmpty.

Ya da daha açık hale:

Bu (katlamak) getOrElse ifEmpty f scala.Option haritası eşdeğerdir.

Yani fold ilk parametresi (call-by-name) tembel ve Option boş olması durumunda değerlendirir. İkinci parametre (bir işlev), yalnızca Option boş değilse çağrılır.

Deney:

İşte
scala> Some(0).fold({println("1");1}){_ => println("2"); 2} 
2 
res0: Int = 2 

scala> None.fold({println("1");1}){_ => println("2"); 2} 
1 
res1: Int = 1 

hakkında bazı okumalar var:

https://kwangyulseo.com/2014/05/21/scala-option-fold-vs-option-mapgetorelse/

Ve bu yaklaşımın bazı eleştirmenler:

http://www.nurkiewicz.com/2014/06/optionfold-considered-unreadable.html

Ancak, Option.fold() öğesinde sözleşme farklıdır: katlama işlevi 'u iki yerine yalnızca bir parametre alır. numaralı önceki makalemi okuduktan sonra, küçültme işlevinin her zaman iki parametresini aldığını biliyorsunuz: geçerli eleman ve birikmiş değer (ilk iterasyon sırasında başlangıç ​​değeri ). Ancak Option.fold() sadece bir parametre alır: akım Seçenek değeri! Bu, özellikle 1.seçeneğinin Option.foldLeft() ve Option.foldRight() öğesinin doğru sözleşmesine sahip olduğunda tutarlılığını bozar (ancak daha okunabilir olduğu anlamına gelmez).

+0

Detay açıklaması için çok teşekkür ederim. Nötr argümanın tembelliğine dayanan bir açıklama yapmak için başvurdum ve iki parametrede çalışmadığı için fonksiyonda kullanılmadığı için asla çağrılmadığını anladım. Hangi size yakındı, gerçek, işlevin sadece bir parametre almasıdır. Bu farkı bilmek çok güzel, teşekkürler. – MaatDeamon