Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的部分应用函数与类型推断_Scala_Type Inference - Fatal编程技术网

Scala中的部分应用函数与类型推断

Scala中的部分应用函数与类型推断,scala,type-inference,Scala,Type Inference,我一直在试验部分应用的函数,这样的事情就发生了。假设我们有这样的代码: class Color(name:String) { override def toString = name } class Point(x: Int, y:Int) { override def toString:String = "("+x +"," + y + ")" } class Linestyle(name: String) { override def toString = name } def d

我一直在试验部分应用的函数,这样的事情就发生了。假设我们有这样的代码:

class Color(name:String) {
override def toString = name
}

class Point(x: Int, y:Int) {
override def toString:String = "("+x +"," + y + ")"
 }

class Linestyle(name: String) {
override def toString = name
 }

def drawLine(width:Double, color: Color, style: Linestyle, a:Point, b: Point): Unit = {
println("Draw " + width + " " + color + " " + style + " " + " line from point: " + a +  " to point " + b)
}
当我尝试创建drawSolidLine函数时,该函数仅采用4个参数:

def drawSolidLine (c: Color, a:Point, b: Point):Unit =
drawLine(1.0, _:Color, new Linestyle("SOLID"), _:Point, _:Point)
试着叫它

drawSolidLine(2.5, new Color("Black"),new Point(2,4), new Point(3,1))
我没有编译器错误,但是调用没有返回任何内容

另一方面,当我以这种方式创建drawSolidLine时:

val drawSolidLine = drawLine(_:Double, _:Color, new Linestyle("SOLID"),
                            _:Point, _:Point)
在调用之前,我得到了所需的输出:

Draw 1.0 Black SOLID  line from point: (2,4) to point (3,1)

我错过了什么?

你在做两件截然不同的事情。第一:

def drawSolidLine (c: Color, a:Point, b: Point):Unit =
  drawLine(1.0, _:Color, new Linestyle("SOLID"), _:Point, _:Point)
首先,请注意,没有使用您传递的任何参数。表达式
drawLine(1.0,quo:Color,new Linestyle(“SOLID”),quo:Point,:Point)
是一个函数,它不依赖于传递的参数,并且将被返回,但返回类型是
Unit
。在这种情况下,函数被丢弃

第二:

val drawSolidLine = drawLine(_:Double, _:Color, new Linestyle("SOLID"),
                             _:Point, _:Point)
首先,您可以将
val
替换为
def
,其工作原理相同。Val vs def不是问题所在


因此,
drawSolidLine
将返回相同的函数,因为它的类型不是
Unit
。但是,这一次,
(2.5,新颜色(“黑色”)、新点(2,4)、新点(3,1))
没有被传递到
drawSolidLine
,因为它不接受任何参数。因此,它们将被传递给正在返回的函数,从而产生所需的效果。

您正在做两件截然不同的事情。第一:

def drawSolidLine (c: Color, a:Point, b: Point):Unit =
  drawLine(1.0, _:Color, new Linestyle("SOLID"), _:Point, _:Point)
首先,请注意,没有使用您传递的任何参数。表达式
drawLine(1.0,quo:Color,new Linestyle(“SOLID”),quo:Point,:Point)
是一个函数,它不依赖于传递的参数,并且将被返回,但返回类型是
Unit
。在这种情况下,函数被丢弃

第二:

val drawSolidLine = drawLine(_:Double, _:Color, new Linestyle("SOLID"),
                             _:Point, _:Point)
首先,您可以将
val
替换为
def
,其工作原理相同。Val vs def不是问题所在


因此,
drawSolidLine
将返回相同的函数,因为它的类型不是
Unit
。但是,这一次,
(2.5,新颜色(“黑色”)、新点(2,4)、新点(3,1))
没有被传递到
drawSolidLine
,因为它不接受任何参数。因此,它们将被传递给正在返回的函数,从而产生所需的效果。

感谢您的解释。我在头脑中混合了一些点((。正如我现在看到的,我可以写def drawThinBlackSolidLine(a:Point,b:Point):Unit=drawLine(1.0,新颜色(“黑色”)、新线条样式(“纯色”)、a、b)并得到我想要的东西,而不需要使用任何部分应用程序。或者写def drawThinBlackSolidLine(1.0,新颜色(“黑色”)、新线条样式(“纯色”),_:Point,:Point),没有针对drawThinBlackSolidLine2的输入参数的直接类型规范。或者有其他方法(我只是想知道:)?@Ferbog差不多就是这样。你可以用不同的方式写后者,也可以用前者的参数来修饰,但本质是一样的。谢谢你的解释。我在脑子里混合了一些观点((。正如我现在看到的,我可以写def drawThinBlackSolidLine(a:Point,b:Point):Unit=drawLine(1.0,新颜色(“黑色”),新线条样式(“纯色”),a,b)并在不使用部分应用程序的情况下得到我想要的。或者编写def drawThinBlackSolidLine2=drawLine(1.0,新颜色(“黑色”)、新线条样式(“纯色”)、:Point、:Point),而不直接为drawThinBlackSolidLine2的输入参数指定类型。或者还有其他方法(我只是想知道:)?@ferbolg差不多就是这样。你可以用不同的方式写后者,也可以用前者的参数,但本质是一样的。