从理解转换为地图时出现问题

时间:2019-01-01 22:03:44

标签: scala for-comprehension

我正在尝试将Scala for comprehension转换为使用map,但遇到了问题。

为便于说明,请考虑以下转换是否按预期进行。

scala> for (i <- 0 to 10) yield i * 2
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

scala> 0 to 10 map { _ * 2 }
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

但是,以下操作无效。我犯了什么错误?

scala> import util.Random
import util.Random

scala> for (i <- 0 to 10) yield Random.nextInt(10)
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 0, 7, 5, 9, 4, 6, 6, 6, 3, 0)

scala> 0 to 10 map { Random.nextInt(10) }
<console>:13: error: type mismatch;
 found   : Int
 required: Int => ?
       0 to 10 map { Random.nextInt(10) }
                                   ^

根本原因可能是我无法正确解读错误消息或无法解决原因。当我查看Random.nextInt的签名时,似乎正在返回Int

scala> Random.nextInt
   def nextInt(n: Int): Int   def nextInt(): Int

错误消息是说,我需要提供一个接受Int并返回“某物”的函数(不确定?代表什么)。

required: Int => ?

所以我可以看到不匹配。但是如何将想要发生的事情(对Random.nextInt(10)的调用)转换为函数并将其传递给map

希望能帮助您理解以下错误消息。

scala> 0 to 10 map { Random.nextInt(10) }
<console>:13: error: type mismatch;
 found   : Int
 required: Int => ?
       0 to 10 map { Random.nextInt(10) }
                                   ^

(编辑)

执行以下操作有帮助。

scala> def foo(x: Int): Int = Random.nextInt(10)
foo: (x: Int)Int

scala> 0 to 10 map { foo }
res10: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 2, 1, 7, 6, 5, 1, 6, 0, 7, 4)

但是对此发表评论或建议使用Scala-way的建议将会受到赞赏。

1 个答案:

答案 0 :(得分:4)

错误消息中的Int => ?意味着编译器希望看到从Int到某个其他类型(?)的函数。但是Random.nextInt(10)不是一个函数,它只是一个Int。您必须采用整数参数:

0 to 10 map { i => Random.nextInt(10) }

您还可以显式忽略该参数:

0 to 10 map { _ => Random.nextInt(10) }

,或者甚至更好,只需使用fill

Vector.fill(10){ Random.nextInt(10) }