SORU
16 Aralık 2010, PERŞEMBE


ifadeler için Scala karşı dosyalarda grup

Programming in Scala ile gidiyorum ve Python bakış açısından şeyler bakmak için cazip değilim ama program istemiyorum "Scala. Python"

Oldukça kontrol akış gelince ne yapacağımdan emin değilim: Python, ölüme for x in some_iterable kullanıyoruz ve çok seviyoruz. Bir çok benzer bir yapı . aramalar Odersky olan Scala var ^em>ifademuhtemelen döngü için Java ayırmak için. Ayrıca, Scala foreach bir öznitelik (öznitelik olurdu sanırım, doğru adı için Scala hakkında yeterince bilgim yok) iterable veri türleri vardır. foreach bir kabın içinde, her madde için, ama işlevi çok daha fazlasını yapmak için kullanabilirim gibi görünmüyor.

Bu bir kaç soru ile beni bırakır. İlk olarak, için ifadeleri önemli/yoğun olarak kullanılan yapıları Scala gibi Python, ve ikinci olarak, ne zaman kullanmalıyım foreach yerine bir ifade (başka bunun en bariz örneği arama fonksiyonu her maddenin bir kap)?

Çok belirsiz ya da kapsamının da son derece geniş olan ben değilim umarım, ama sadece Scala çok güzel şimdiye kadar görünen () tasarım/dili temel bazı grok için çalışıyorum.

CEVAP
17 Aralık 2010, Cuma


python liste üreteçleri ve jeneratör ifadeleri for kullanır. Buçokfor scala ifadesine benzer:

bu python

>>> letters = ['a', 'b', 'c', 'd']
>>> ints = [0, 1, 2, 3]
>>> [l   str(i) for l in letters for i in ints if i % 2 == 0]
['a0', 'a2', 'b0', 'b2', 'c0', 'c2', 'd0', 'd2']

bu scala

scala> val letters = List('a', 'b', 'c', 'd')
scala> val ints = List(0, 1, 2, 3)
scala> for (l <- letters; i <- ints if i % 2 == 0) yield l.toString   i
res0: List[java.lang.String] = List(a0, a2, b0, b2, c0, c2, d0, d2)

Her inşa jeneratörleri/kullanımına bir numara al, filtreler ifadeler uygulamak ve kombine bir ifade verebilir. Python (expr for v1 in gen1 if expr1 for v2 in gen2 if expr2) Aşağı Yukarı eşit sayılır:

for v1 in gen1:
  if expr1:
    for v2 in gen2:
      if expr2:
        yield expr

Scala for (v1 <- gen1 if expr1; v2 <- gen2 if expr2) yield expr Aşağı Yukarı eşit sayılır:

gen1.withFilter(expr1).flatMap(v1 => gen2.withFilter(expr2).map(v2 => expr))

Eğer for x in xs sözdizimi python seviyorsanız, büyük ihtimalle for scala ifade seveceksiniz.

Scala bazı ek sözdizimi ve çeviri katlanmış. Sözdizimi bilge. Ayrıca değer atamaları gerçekleştirebilirsiniz.

val res = for {
    i <- 1 to 20; i2 = i*i
    j <- 1 to 20; j2 = j*j
    k <- 1 to 20; k2 = k*k
    if i2   j2 == k2
  } yield (i, j, k)

Ayrıca v1 <- gen1 gerçekten bir maç case v1 => gen1 gerçekleştirir. Eğer eşleşme yok bu öğeleri yineleme itibaren yok sayılır.

scala> val list = List(Some(1), None, Some(2))
scala> for (Some(i) <- list) yield i
res2: List[Int] = List(1, 2)

for dil önemli bir yere sahip olduğunu düşünüyorum. Okuduğun kitapta koca bir bölüm (23) olan birşey yok aslında söyleyebilirim!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • Elly Awesome

    Elly Awesome

    15 ŞUBAT 2010
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007