gpt4 book ai didi

scala - 无法理解 Scala 中的类型错误

转载 作者:行者123 更新时间:2023-12-01 08:20:34 25 4
gpt4 key购买 nike

这是 POC 代码:

object TypeTest extends Application {
val stuff = List(1,2,3,4,5)
def joined:String = stuff.reduceLeft(_ + ", " + _)

println(joined)
}

编译时出现如下错误:

tt.scala:4: error: type mismatch;
found : java.lang.String
required: Int
def joined:String = stuff.reduceLeft(_ + ", " + _)
^
tt.scala:4: error: type mismatch;
found : Int
required: String
def joined:String = stuff.reduceLeft(_ + ", " + _)
^

像这样编写连接函数

reduceLeft(_.toString + ", " + _.toString)

没有帮助,仍然给出同样的错误。但是,如果我这样写

def joined:String = stuff.map(_.toString).reduceLeft(_ + ", " + _)

一切都很好。

有人可以解释一下这种奇怪的类型错误组合吗?这里究竟发生了什么?第二个特别奇怪,因为存在从 Int 到 String 的隐式转换。

最佳答案

reduceLeft 要求函数 block (括号内)返回与集合相同的类型。这是因为 block 被递归调用,直到集合的所有值都被消耗掉。

stuff 是一个 List[Int],但是 (_ +", "+ _) 是一个 String,因此类型错误。

与 reduceLeft 类似的方法是 foldLeft。区别在于集合类型和结果类型可以不同。例如:

stuff.foldLeft("") { _ + ", " + _ } // => java.lang.String = , 1, 2, 3, 4

我想你的例子是指示性的,但如果你真的想要一个逗号分隔值的字符串,那么下面会更好:

stuff.mkString(", ") // => String = 1, 2, 3, 4

关于scala - 无法理解 Scala 中的类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1465115/

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