gpt4 book ai didi

scala - 为什么 reduceLeft 提示类型不匹配?

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

我正在尝试找出一组线条中最长的线条的长度。

  val lines = Source.fromFile(args(0)).getLines() //a collection of strings
val longestLine = lines.reduceLeft( (a,b) =>
if(a.length > b.length) a.length else b.length )

但这会导致以下错误:

/home/jesvin/dev/scala/readfile.scala:11: error: type mismatch;
found : Int
required: String
if(a.length > b.length) a.length else b.length )
^
/home/jesvin/dev/scala/readfile.scala:11: error: type mismatch;
found : Int
required: String
if(a.length > b.length) a.length else b.length )
^
two errors found

我在某些位置尝试了一些显式返回语句和类型转换,但没有用。

我使用的 reduceLeft 错了吗?

最佳答案

Am I using reduceLeft wrong?

是的,您想要fold 的行为而不是reduce 的行为。 reduce 生成与集合的类型参数相同的类型 - 它是 fold 可以生成另一种类型。

scala> Seq("a","b","cd").reduceLeft(_+_)
res24: String = abcd

这里,Seq 的类型参数是 String - 因此 reduceLeft 也产生一个 String。

scala> Seq("a","b","cd").foldLeft(0)(_+_.length)
res25: Int = 4

相比之下,foldLeft 可以生成另一种类型 - 在本例中为 Int。

在您的示例中,seq.max 就是您想要的。尝试自己实现它,然后在获得它时查看源代码以验证您的实现是否正确。

提示:reduce 是一个fold,其实现如下:

def reduce(f: (A, A) => A) =
tail.fold(head)(f)

这就是为什么 reduce 在调用空集合时抛出异常的原因。

关于scala - 为什么 reduceLeft 提示类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9958169/

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