Scala Curried类型不匹配

约阿希姆

经过反复试验和研究,我得到了以下功能,我可以提出一个解决方案。

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 
}

如果我不认为那是类型不匹配,那么有人可以详细说明/解释此行的要求吗?

Sarveshseri

因此,要真正理解答案,您需要了解很多事情。

在Scala中,任何defamethod都不过其中一些成员之一objectmethods不是Scala中的头等舱成员,这也意味着它们methods不能独立存在。

在Scala中,value任何事物都必须是expression意味着RHSdef需要一个类似的表达式def abc = some-expression表达的实例是11 + 1"xyz"anotherMethodCallWhichWillReturnAnExpression()等。

而类似的东西def abc = xxxxxx并不是expressionScala语言中的定义。因此,你不能做,

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

注意实际斯卡拉控制台输出之间的差别valuesdef现在,如果我尝试使用prodA1作为valueval,我会得到下面的错误。

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是告诉你,你可以明确地转换methodfunction使用_让我们尝试一下。

scala> val x = prodA1 _
// x: (Int, Int) => Int = $$Lambda$1077/293669143@13278a41

现在xfunction类型(Int, Int) => Int

同样,第一行Unapplied methods are only converted to functions when a function type is expected.告诉您案件中实际发生的情况。

由于prodC1预期返回function的类型是(Int, Int) => Int您提供的prodA1,因此Scalaeta-expansion会自动将您转换methodfunction

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章