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
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 Seq
s.) 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ı.
Bir şekilde Android üzerinde Python ça...
Nasıl iPhone SDK üzerinde etkin bir İn...
C bir Sözlük üzerinde yineleme için en...
Nasıl bir DOM düğüm üzerinde olay dinl...
Nasıl bir hizmet Android üzerinde çalı...