scala - 为什么我在 StringOps.foreach 中的表达式不正确

标签 scala

我尝试使用 foreach 计算字符串的 unicode 值的乘积。

scala> var s:Long = 1;"Hello".foreach(s *= _)
s: Long = 9415087488

scala> var s:Long = 1;"Hello".foreach(s = s * _)
<console>:10: error: missing parameter type for expanded function ((x$1) => s.$times(x$1))
       "Hello".foreach(s = s * _)
                               ^

我想知道为什么 s = s * _ 这里不正确,s *= _ 和 s = s * _ 有什么区别

最佳答案

foreach 函数的签名是:

def foreach(f: (A) => Unit): Unit

也就是说,它采用 A 类型的函数至Unit对于某些合适的类型 A .

所以这就是我认为正在发生的事情:

在第一个实例中,编译器解释表达式 s *= _作为函数 f 的右侧(返回 Unit 的表达式 - 即什么都没有 - 意味着它的执行只是为了产生副作用 - 在本例中更新 s 的值)。由于该表达式中有一个下划线,编译器会为 f 假设一个合适的左侧。

在第二个实例中,编译器可以解释表达式 s = s * _作为 f 的左侧和右侧,因此 ss =应该定义类型 A表达式的,但它不知道下划线代表什么并提示。

我还应该注意到,执行此类计算的更惯用的函数式风格是使用折叠:

scala> val s = "Hello".foldLeft(1L)(_ * _)
s: Long = 9415087488

关于scala - 为什么我在 StringOps.foreach 中的表达式不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19181964/

相关文章:

scala - 带有Call-by-name参数的函数文字

scala - 如何初始化元组列表并在scala中添加项目

Scala:结束 Stream.iterate

scala - Typesafe Activator 在运行类时指定参数

scala - 从配置单元表中读取并使用 spark sql 写回它

Scala - Spray.io - sbt-revolver - jrebel - 重新加载时没有看到 HttpService (或任何内容)的更改

scala - 如何解决 Scala 中重载解析的这种限制?

scala - Future 的 OnSuccess 调用中变量的范围发生了变化

java - 在 Avro 生成的 java 类上的 Scala 中需要 CharSequence 的 String 上出现类型不匹配

scala - HList 上的类型级映射