gpt4 book ai didi

scala - 如何在 Scala 中使用 StringOps 的 fold 方法?

转载 作者:行者123 更新时间:2023-12-04 17:52:19 24 4
gpt4 key购买 nike

我试图在 scala 中计算字符串“Hello”的 unicode 的乘积。在 StringOps scala API 中,我找到了 fold 和 foldLeft 方法,并使用上述两种方法编写了一些代码:

val s = "Hello"
s.fold(1L){(z, i) => z*i}
s.foldLeft(1L){(z, i) => z*i}

通过使用第二个表达式,我可以得到正确的答案,但是第一个不能,IDE 会提示“无法解析符号 *”,有人可以解释一下吗?

最佳答案

如果您查看fold 的类型签名:

fold[A1 >: Char](z: A1)(op: (A1, A1) ⇒ A1): A1

您会看到它只对 Char 的父类(super class)型进行操作,因此使您的表达式变得不可能并且编译器会抛出错误。

foldLeft 但是允许您使用结果类型 B

foldLeft[B](z: B)(op: (B, Char) ⇒ B): B

这允许您编写当前表达式。

回顾一下:fold 需要一个 Char 作为它的种子参数(当你提供 1L 作为你的种子时,编译器会报错),而foldLeft 需要您的 op 函数的结果类型。

更新:

s.fold(1L){(z, i) => z} 也被编译器认为是正确的。这是因为 CharLong 共享父类(super class)型 AnyVal。由于 fold 需要 Char 的父类(super class)型,因此提供 AnyVal 也可以。这也是编译器提示找不到函数*的原因,因为它没有定义在类型AnyVal上。

更新 2:

如果您真的想使用fold 而不是foldLeft,您必须事先将s 映射到Seq[Long]。即:

s.map(_.toLong).fold(1L){(z, i) => z*i} //returns 9415087488

关于scala - 如何在 Scala 中使用 StringOps 的 fold 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42085338/

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