Scala List最大值获取失败:《Programming in Scala 第3版》示例代码报错
从截断的错误信息来看,核心问题应该是Scala没法为你传入的列表元素类型T找到对应的隐式Ordering[T]实例——这段函数的逻辑本身是完全正确的,问题出在调用环节或者你使用的Scala版本上。
给你几个针对性的解决办法:
如果用的是Scala 2,调用的是Int、String这类标准类型
标准类型的Ordering实例Scala标准库已经帮你写好了,但有时候REPL可能没自动导入,手动加一行导入就行:import scala.math.Ordering._之后再调用比如
maxListImpParm(List(3,1,4,1,5))就正常了。如果用的是Scala 3
Scala 3对隐式参数的语法做了调整,虽然兼容旧写法,但更推荐用using关键字。适配后的代码如下:def maxListImpParm[T](elements: List[T])(using ordering: Ordering[T]): T = { elements match { case List() => throw new IllegalArgumentException("empty list!") case List(x) => x case x :: rest => val maxRest = maxListImpParm(rest) if (ordering.gt(x, maxRest)) x else maxRest } }调用的时候Scala 3会自动查找对应的
Ordering实例,不用额外传参。如果用的是自己定义的类型
比如你写了个Person类,那得手动给它加个隐式Ordering实例,比如按年龄排序:case class Person(name: String, age: Int) // 定义按年龄排序的隐式规则 implicit val personOrderByAge: Ordering[Person] = Ordering.by(_.age) // 现在就能正常调用了 maxListImpParm(List(Person("Alice", 25), Person("Bob", 30), Person("Charlie", 20)))
内容的提问来源于stack exchange,提问作者Steven Li
相关产品推荐
相关产品推荐

