gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:39:16 25 4
gpt4 key购买 nike

我尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com