SORU
18 Ocak 2011, Salı


Tür Anlama İçin Scala üzerinde Uyuşmazlığı

Neden bu inşaat Scala Türü Uyuşmazlığı hatası neden olur?

for (first <- Some(1); second <- List(1,2,3)) yield (first,second)

<console>:6: error: type mismatch;
 found   : List[(Int, Int)]
 required: Option[?]
       for (first <- Some(1); second <- List(1,2,3)) yield (first,second)

Eğer bir Liste ile geçerseniz iyi derler:

for (first <- List(1,2,3); second <- Some(1)) yield (first,second)
res41: List[(Int, Int)] = List((1,1), (2,1), (3,1))

Bu da gayet iyi çalışıyor:

for (first <- Some(1); second <- Some(2)) yield (first,second)

CEVAP
18 Ocak 2011, Salı


Kapsam map flatMap yöntem çağrıları dönüştürülür. Örneğin bu bir:

for(x <- List(1) ; y <- List(1,2,3)) yield (x,y)

şu olur:

List(1).flatMap(x => List(1,2,3).map(y => (x,y)))

Bu nedenle, ilk döngü değeri (bu durumda List(1)) flatMap yöntem çağrısı alırsınız. List döner flatMap anlama List sonucu başka ders List olacak. (Bu benim için yeni bir şey: kapsam her zaman akışları bile mutlaka Seqs.) neden bilmiyorum

Şimdi, flatMap Option: ilan nasıl bir göz atın

def flatMap [B] (f: (A) ⇒ Option[B]) : Option[B]

Bunu göz önünde bulundurun. Hadi anlama için hatalı (Some(1)) göster bir arama dizisi dönüşür nasıl

Some(1).flatMap(x => List(1,2,3).map(y => (x, y)))

Şimdi, kolay flatMap çağrı parametre döndüren bir şey olduğunu görmek için bir List, ama gerekli değil gibi Option, bir.

Şey düzeltmek için, aşağıdakileri yapabilirsiniz:

for(x <- Some(1).toSeq ; y <- List(1,2,3)) yield (x, y)

Bu çok iyi derler. Option genellikle kabul edilir gibi Seq, sadece bir tarafta değil fazlalaştı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Police

    Android Poli

    21 NİSAN 2010
  • JamesAtiPhone

    JamesAtiPhon

    16 EYLÜL 2010
  • TokShogun

    TokShogun

    6 HAZİRAN 2009