SORU
27 HAZİRAN 2009, CUMARTESİ


Scala'nin verimi nedir?

Ruby ve Python getiri anlıyorum. Scala'nın verim ne yapar?

CEVAP
29 HAZİRAN 2009, PAZARTESİ


Kabul cevabı harika olduğunu düşünüyorum, ama birçok kişi bazı temel noktaları kavramak için başarısız olmuş gibi görünüyor.

İlk, Scala "" Haskell eşdeğerdir "" gösterim ve çoklu monadic işlemleri kompozisyon için. sözdizimsel bir şeker daha fazla bir şey olup, bu kapsam için. Bu ifade, büyük olasılıkla yardım, yeniden deneyelim ihtiyaç duyan herkes yardımcı olacaktır... :-)

Scala "kapsam" harita ile çoklu işlemler kompozisyon için sözdizimsel şeker, flatMap ve filtre. Ya dosyalarda grup. Scala aslında bu yöntem çağrıları için bir ifade çevirir, herhangi bir sınıf veya bir alt kümesini sağlayan, kapsam için kullanılabilir.

İlk olarak, çeviriler hakkında konuşmak. Çok basit bir kural vardır:

1) Bu

for(x <- c1; y <- c2; z <-c3) {...}

olur çevrildi

c1.foreach(x => c2.foreach(y => c3.foreach(z => {...})))

2) Bu

for(x <- c1; y <- c2; z <- c3) yield {...}

olur çevrildi

c1.flatMap(x => c2.flatMap(y => c3.map(z => {...})))

3) Bu

for(x <- c; if cond) yield {...}

içine Scala 2.7 çevrilir

c.filter(x => cond).map(x => {...})

ya, Scala üzerinde 2.8, içine

c.withFilter(x => cond).map(x => {...})

yöntem eski bir çare ile withFilter kullanılabilir değil ama filter. Aşağıda bu konuda daha fazla bilgi için Düzenle bakın lütfen.

4) Bu

for(x <- c; y = ...) yield {...}

olur çevrildi

c.map(x => (x, ...)).map((x,y) => {...})

Kapsam için çok basit baktığınızda, dosyalarda grup alternatif/harita gerçekten daha iyi bak. Bunları oluşturmaya başladığınızda, bir kez olsa da, kolayca parantez ve yuvalama seviyeleri içinde kaybolabilir. Bu durumda, kapsam genellikle çok net olur.

Basit bir örnek göstermek ve kasıtlı olarak herhangi bir açıklama ommit ederim. Anlamak daha kolay olduğunu karar verebilirsiniz.

l.flatMap(sl => sl.filter(el => el > 0).map(el => el.toString.length))

ya

for{
  sl <- l
  el <- sl
  if el > 0
} yield el.toString.length

EDİT

Scala 2.8 bir yöntem, yeni, süzülmüş, bir koleksiyon döndürmek yerine, isteğe bağlı filtreler olan withFilter denilen tanıttı. filter yöntem davranışını koleksiyon katılık dayalı olarak tanımladı. Bunu daha iyi anlamak için, hadi List () katı ve Stream ile bazı Scala 2.7 bak (non-strict):

scala> var found = false
found: Boolean = false

scala> List.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3
7
9

scala> found = false
found: Boolean = false

scala> Stream.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3

Fark found false olduğundan filtre hemen List oranlar listesi dönen uygulandığından -- olur. Ancak o zaman foreach yürütülür, ama bu kez, found değişen filter zaten idam gibi anlamsız.

Stream Bu durumda hemen uygulanmaz. Bunun yerine, her bir eleman foreach, filter tarafından istendiği gibi foreach etkileme found ile sağlayan koşul, testler. Sadece açık,-anlama için kod eşdeğer

for (x <- List.range(1, 10); if x % 2 == 1 && !found) 
  if (x == 5) found = true else println(x)

for (x <- Stream.range(1, 10); if x % 2 == 1 && !found) 
  if (x == 5) found = true else println(x)

Bu insanlar üzerinde-talep, tüm koleksiyonu önceden uygulanmakta yerine sayılacak if beklenen çünkü birçok sorunlara yol açtı.

Scala 2.8 olan withFilter tanıttıher zamanolmayan katı, koleksiyon katılık olursa olsun. Aşağıdaki örnek, Scala 2.8: her iki yöntem ile List gösterir

scala> var found = false
found: Boolean = false

scala> List.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3
7
9

scala> found = false
found: Boolean = false

scala> List.range(1,10).withFilter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3

Bu insanların çoğu beklediğiniz sonucu, filter nasıl davranacağını değiştirmeden üretir. Bir yan not olarak, 49* *Scala Scala 2.7 ve 2.8 arasında sıkı olmayan katı olarak değiştirildi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • aki6336

    aki6336

    14 AĞUSTOS 2008
  • infodirt

    infodirt

    11 Mart 2009
  • Muse

    Muse

    28 EYLÜL 2006