Scala Pętla for z ciałem i yield

Odpowiedz Nowy wątek
2019-03-29 21:23

Rejestracja: 5 lat temu

Ostatnio: 3 tygodnie temu

Lokalizacja: Kraków

0

Cześć :)
Uczę się scali, bawiłem się forem z yield i napisałem taki fragment kodu

val numList2 = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val x = for(g <- numList2 if g % 3 == 0) yield g {
    println("Something")
}

println(s"\nx = $x")

IntelliJ nie pokazuje żadnego problemu ale podczas kompilacji wywala:
Error:(21, 58) Int does not take parameters val x = for(g <- numList2 if g % 3 == 0) yield g {

Nie da się zrobić pętli która zwróci wyniki i jednocześnie będzie coś robić wewnątrz? Czy może to trzeba inaczej zrobić?

Pozostało 580 znaków

2019-03-29 22:23

Rejestracja: 3 lata temu

Ostatnio: 4 godziny temu

0

Jak pokazuje: https://stackoverflow.com/questions/9796939/scala-yield-syntax
oraz to: https://docs.scala-lang.org/tutorials/FAQ/yield.html
"In Scala, yield is part of for comprehensions – a generalization of Ruby and Python’s list-comprehensions." - czyli za bardzo nie ma sensu blok za yield.


Pozostało 580 znaków

2019-03-30 13:25

Rejestracja: 4 lata temu

Ostatnio: 3 godziny temu

0

Nie do końca nie ma sensu.

Blok za yield może być stosowany i nie ma w tym nic złego. W przypadku z pierwszego posta nie ma sensu ponieważ jest to odczytywane przez kompilator jakbyś próbował do g, który jest Int'em przekazać parametr jak do funkcji. To co chcesz osiągnąć można (zapewne, zależy co chcesz kiedy printować) zrobić na przykład tak:

val numList2 = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val x = for(g <- numList2 if g % 3 == 0) yield {
    println("Something")
    g
}

println(s"\nx = $x")

lub:

  val numList2 = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  val x = for {
    g <- numList2
    if g % 3 == 0
    _ = println("Something")
  } yield g
  println(s"\nx = $x")
No tak, ale po co tak udziwniać yield. - lion137 2019-03-30 13:28
Na ogół nie ma sensu, ale przy nauce nie wchodząc jeszcze w detale jak for się rozkłada na mapy/flatMapy/foreache itd. warto wiedzieć, że istnieje taka możliwość - DisQ 2019-03-30 13:50

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0