经过反复试验和研究,我得到了以下功能,我可以提出一个解决方案。
def prodC1(f : Int => Int) : (Int, Int) => Int = {
def prodA1(a : Int, b : Int) : Int =
if(a > b) 1 else f(a) * prodA1(a+1, b)
prodA1 // Why do i need this line here
}
如果我不认为那是类型不匹配,那么有人可以详细说明/解释此行的要求吗?
因此,要真正理解答案,您需要了解很多事情。
在Scala中,任何def
amethod
都不过是其中一些成员之一object
。methods
不是Scala中的头等舱成员,这也意味着它们methods
不能独立存在。
在Scala中,value
任何事物都必须是expression
。意味着RHSdef
需要一个类似的表达式def abc = some-expression
。表达的实例是1
,1 + 1
,"xyz"
,anotherMethodCallWhichWillReturnAnExpression()
等。
而类似的东西def abc = xxxxxx
并不是expression
Scala语言中的定义。因此,你不能做,
def prodC1(f : Int => Int) : (Int, Int) => Int = {
def prodA1(a : Int, b : Int) : Int =
if(a > b) 1 else f(a) * prodA1(a+1, b)
}
现在,当您使用添加额外的行时prodA1
,您告诉Scala返回prodA1
您刚刚定义的内容。但是请记住prodA1
只是一个method
,因此不能单独存在,因此不能实际返回。
但是functions
是Scala中的一等成员(表示为各种FunctionX
类之一的实例),因此可以返回。
在这种情况下斯卡拉会智能地提升这个method
成为一个function
类型的(Int, Int) => Int
。这称为eta扩展。
为了更详细地了解事物。您可以打开Scala控制台,然后尝试以下操作。
scala> val s = "abc"
// s: String = abc
scala> val i = 10
// i: Int = 10
scala> def prodA1(a : Int, b : Int) : Int = if (a > b) 1 else a * prodA1(a+1, b)
// prodA1: (a: Int, b: Int)Int
注意实际斯卡拉控制台输出之间的差别values
和def
。现在,如果我尝试使用prodA1
作为value
的val
,我会得到下面的错误。
scala> val x = prodA1
// <console>:12: error: missing argument list for method prodA1
// Unapplied methods are only converted to functions when a function type is expected.
// You can make this conversion explicit by writing `prodA1 _` or `prodA1(_,_)` instead of `prodA1`.
// val x = prodA1
Scala是告诉你,你可以明确地转换method
到function
使用_
。让我们尝试一下。
scala> val x = prodA1 _
// x: (Int, Int) => Int = $$Lambda$1077/293669143@13278a41
现在x
是function
类型(Int, Int) => Int
。
同样,第一行Unapplied methods are only converted to functions when a function type is expected.
告诉您案件中实际发生的情况。
由于prodC1
预期返回function
的类型是(Int, Int) => Int
您提供的prodA1
,因此Scalaeta-expansion
会自动将您转换method
为function
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句