【发布时间】:2019-02-01 03:11:57
【问题描述】:
我对 Scala 很陌生,所以请原谅这可能是对语言的简单误解。我有一个功能:
def compareNextElemToMinElem(lst: List[Int]) = {
val max = lst.foldLeft((lst(0),lst(0),0)) { (minSoFar:Int, x:Int, maxDiff:Int) =>
if (x < minSoFar) (minSoFar, x, maxDiff)
if (x - minSoFar > maxDiff) (minSoFar, x, x - minSoFar)
else (minSoFar, x, x - minSoFar)
}
max._3
}
基本上它应该一次去一个元素,并跟踪迄今为止最大的元素差异。通过调用 max._3,我希望从 foldLeft 调用中返回最终的 maxDiff。我收到一个错误:
type mismatch;
found : (Int, Int, Int) => (Int, Int, Int)
required: ((Int, Int, Int), Int) => (Int, Int, Int)
val max = lst.foldLeft((lst(0),lst(0),0)) { (minSoFar:Int, x:Int, maxDiff:Int) =>
此外,我必须使用 (minSoFar:Int, x:Int, maxDiff:Int) 而不是 (minSoFar, x, maxDiff) 以避免出现 missing parameter type 错误。这是为什么呢?
【问题讨论】:
-
“元素的最大区别” - 在 what 元素中?它应该计算什么?
lst.max - lst.min?或者两个连续元素之间的最大差异?在任何情况下,折叠都不需要三参数函数,您必须以不同的方式嵌套元组,并且您可能需要一个case来正确匹配所有组件。 -
不是
lst.max - lst.min,而是当前元素减去到目前为止的最小值。我不确定你的意思,我对此很陌生。 -
for list(1,2,3,-1,4,-2) 我想要 4-(-1) 或 5。