English 中文(简体)
B. 需求帮助将微量编造错误
原标题:Need help figuring out scala compiler errors

I have been working on a project in scala, but I am getting some error messages that I don t quite understand. The classes that I am working with are relatively simple. For example:

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))

然后,如果我试图确定可能包含多角的最小 rec的位置和大小,我就会发现我不理解的各种错误。

下面是不同尝试的幻灯和它们产生的相应的错误信息。

val upperLeftX = poly.points.reduceLeft(Math.min(_.x, _.x))

Gives the error:
"missing parameter type for expanded function ((x$1) => x$1.x)"

val upperLeftX =  
         poly.points.reduceLeft((a: Point, b: Point) => (Math.min(a.x, b.x)))

Gives this error:
"type mismatch;
found : (Point, Point) => Int
required: (Any, Point) => Any
"

我非常混淆了这两种错误信息。 如果任何人能够更清楚地解释我不正确做些什么,我会真的赞赏。 是的,我认为第二个错误说,我需要“阿尼”类,但我不确切理解如何实施我所需要的变革。 显然,仅仅将“a:点”改为“a:任何”不是一个可行的解决办法,因此我失踪了什么?

最佳回答

<代码>reduceLeft :reduceLeft[B >:A](op: (B, A) => B:B,:<>>>>><>>>>>>>>。 Point, b: Point) => (Math.min(a.x, b.x)

因此,汇编者的理由:Math.min(a.x, b.x) 斜线/代码必须是<代码>的亚类。 B。 。 还必须是<代码><>>>>>>>的超级类型。 为什么? <代码>B为加固剂类型,其初始价值为<>>>>>>>。 这符合<代码>B >:A的含义。

<代码>唯一的超级型号 www.un.org/Depts/DGACM/index_french.htm 如错误信息所示,应为<代码>(Any, Point) => 任何。

问题回答

参见Schala 2.8.0.RC2。

scala> abstract class Shape
defined class Shape

scala> case class Point(x: Int, y: Int) extends Shape
defined class Point

scala> case class Polygon(points: Point*) extends Shape
defined class Polygon

scala> val poly = new Polygon(new Point(2,5), new Point(7,0), new Point(3,1))
poly: Polygon = Polygon(WrappedArray(Point(2,5), Point(7,0), Point(3,1)))

scala> val upperLeftX = poly.points.reduceLeft((a:Point,b:Point) => if (a.x < b.x) a else b)
upperLeftX: Point = Point(2,5)

<代码>reduceLeft 在此要求具备以下类型的功能: (Point, Point) => Point。 (更确切地说,(B, Point) => B with B, with a reduction to 。 见Scaladoc , 载于reduce

另一种选择是poly.points.raftLeft(Int.MaxValue)(b,a) => Math.min(b, a.x),该编码还应与Schala 2.7.x合作。 与减小的Left版本相比的差异是

  • you have a start value (Int.MaxValue in our case, any real data will be smaller or equal to this)
  • there are no constraints between the type of the elements and the type of the result, like the lower bound constraint for reduceLeft Nevertheless Eastsun s solution is more elegant.

BTW,如果你已经设立了病例班级,那么你就可以om出新的关键词,并且可以将自动产生的工厂方法用于对应物体。 因此,制造聚合物的线变成val poly = Polygon (Point(2,5), Point(7,0), Point(3,1),更容易阅读。

我认为,每个人都似乎已经排在第二位上,因此我回答第一个问题:

val upperLeftX = poly.points.reduceLeft(Math.min(_.x, _.x))

您打算:

val upperLeftX = poly.points.reduceLeft((a, b) => Math.min(a.x, b.x))

然而,这并不是强调工作。 有许多意义可以强调,但其中两个意义在此相关。

首先,这可能意味着部分职能申请。 例如,Math.min(_, 0)部分适用 > 参数至min,并退还适用其余职能的职能。 换言之,它相当于<条码>x => Math.min(x, 0),而忽视了这种说明。 无论如何,如果强调本身在参数的某一(或更多)的位置上,则适用这一意思。

但是,在你的例子中,情况并非如此,因为你在强调后添加了<条码>。 如果强调以任何一种表达形式出现,例如你所举的方法,那么这种强调就是匿名功能中一个参数的持有人。

第二项含义是,了解匿名职能的界限尤为重要。 具体来说,匿名功能将由括号的括号或曲解的括号加以限定,或者由 any加以界定。

如今,将这一规则适用于首批狙击手的表述,就意味着汇编者认为 s灭者是这样:

val upperLeftX = poly.points.reduceLeft(Math.min(a => a.x, b => b.x))

因此,这里有两个问题。 首先,你通过两个职能,即<代码>min,而不是两倍。 第二,因为<代码>min 如果没有期望得到职能,汇编者可以推断这些职能的类型。 由于你没有提供关于上面<代码>a和/code>的类型的任何信息,因此它对此表示不满。

如果你确实提供这种类型的信息,错误信息就是这样:

<console>:6: error: type mismatch;
 found   : Int
 required: ?{val x: ?}




相关问题
C++/CLI : How to override Equal method of Object class

I am a newbie to C++/CLI and is having some problems trying to override the Equal method of the base Object class. I get the following compilation warning error for the following code. How should this ...

处理多重定义错误[封闭]

I m试图汇编一些C++文档。 • 在连接阶段(汇编工作)发现以下几类错误:

What s causing this error in a subclass of MKAnnotationView?

I m trying to create a subclass of MKAnnotationView for an iPhone Mapkit app, but for some reason I am suddenly encountering this error: Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/...

iphlpapi / ifdef.h

I m trying to use iphlpapi (GetAdapterInfo) and am having trouble compiling the code. I have iphlpapi.h from SDK 7 and have added the appropriate path to the include files in visual studio. I get ...

was not declared in this scope C++

Why do I get this error in the code below? class ST : public Instruction{ public: ST (string _name, int _value):Instruction(_name,_value){} void execute(int[]& anArr, int aVal){ //...

Adding an include guard breaks the build

I added #ifndef..#define..#endif to a file of my project and the compiler fails. As soon as I remove it or put any other name in the define it compiles fine. What could be the problem? Sounds like ...

<list> retreving items problem with iterator

I have a list of type Instruction*. Instruction is a class that I made. This class has a function called execute(). I create a list of Instruction* list<Instruction*> instList; I create an ...