Почему я не могу вызвать методы для выражения for-yield?

Скажем, у меня есть такой код Scala:

// Outputs 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
println( squares)

def squares = {
    val s = for ( count <- 1 to 10 )
                yield { count * count }
    s.mkString(", ");
}

Почему я должен использовать временные значения? Я попробовал это:

def squares = for ( count <- 1 to 10 )
                  yield { count * count }.mkString(", ")

Это не в состоянии скомпилировать с этим сообщением об ошибке:

error: value mkString is not a member of Int
   def squares = for ( count <- 1 to 10 ) yield { count * count }.mkString(", ")

не должны mkString вызываться в коллекции, возвращенной for цикл?

3 ответа

Решение

Отсутствует скобка. Вы хотите позвонить mkString метод на результат for-expression. Без лишних скобок компилятор думает, что вы хотите вызвать mkString-метод на {count * cout} который является Int,

scala> def squares = (for ( count <- 1 to 10 ) yield { count * count }).mkString(", ")
squares: String

scala> squares
res2: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

В любом случае, я предлагаю вам использовать map метод вместо:

scala> 1 to 10 map { x => x*x } mkString(", ")
res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

Просто поставьте круглые скобки вокруг цикла for, и это работает:

scala> (for (count <- 1 to 10) yield { count * count }).mkString(", ") 

res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

Когда вы звоните mkString как и во втором примере, он вызывается не для коллекции, а для каждого возвращаемого целого числа, поэтому появляется сообщение об ошибке: mkString is not a member of Int,
Если вы хотите вызвать методы на for..yield само выражение, вам нужно заключить его в скобки:

def squares = (for (count <- 1 to 10) yield { count * count }).mkString(", ")
Другие вопросы по тегам