gpt4 book ai didi

scala - 需要帮助找出 Scala 编译器错误

转载 作者:行者123 更新时间:2023-12-04 13:55:30 26 4
gpt4 key购买 nike

我一直在用 Scala 进行一个项目,但是我收到了一些我不太明白的错误消息。我正在使用的类相对简单。
例如:

abstract class Shape
case class Point(x: Int, y: Int) extends Shape
case class Polygon(points: Point*) extends Shape

现在假设我创建了一个多边形:
val poly = new Polygon(new Point(2,5), new Point(7,0), new Point(3,1))

然后,如果我尝试确定可能包含多边形的最小矩形的位置和大小,则会出现各种我不太明白的错误。

下面是不同尝试的片段以及它们产生的相应错误消息。
val upperLeftX = poly.points.reduceLeft(Math.min(_.x, _.x))

给出错误:
“缺少扩展函数的参数类型 ((x$1) => x$1.x)”
val upperLeftX =  
poly.points.reduceLeft((a: Point, b: Point) => (Math.min(a.x, b.x)))

给出这个错误:
“类型不匹配;
找到:(点,点)=> Int
要求:(任何,点)=> 任何”

我对这两个错误消息感到非常困惑。如果有人能更清楚地解释我做错了什么,我将不胜感激。是的,我看到第二个错误说我需要输入“Any”,但我不明白如何实现可以按我需要工作的更改。显然,简单地将“a:Point”更改为“a:Any”并不是一个可行的解决方案,那么我错过了什么?

最佳答案

reduceLeft的类型是 reduceLeft[B >: A](op: (B, A) => B): B , APoint ,并且您正在尝试将其应用于 (a: Point, b: Point) => (Math.min(a.x, b.x)) .

编译器的原因是:Math.min(a.x, b.x)返回 Int ,所以 Int必须是 B 的子类型.和 B也必须是 Point 的父类(super class)型.为什么? B是累加器的类型,其初始值为第一个Point在您的 Polygon .这就是B >: A的意思.
Int的唯一父类(super class)型和 PointAny ;所以BAnyop 的类型应该是 (Any, Point) => Any ,正如错误消息所说。

关于scala - 需要帮助找出 Scala 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2871344/

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