gpt4 book ai didi

Scala Curried 类型不匹配

转载 作者:行者123 更新时间:2023-12-05 00:11:35 26 4
gpt4 key购买 nike

所以我在我们的教科书中经过一些反复试验和研究后得到了以下功能,我可以想出一个解决方案。

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 中任何 defmethod这只不过是一些 object 的成员之一. methods不是 Scala 中的一流成员,这也意味着 methods不能靠自己存在。

在 Scala 中,value任何东西都必须是 expression .表示 def 的 RHS需要是类似 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 类之一的实例),因此可以返回。

在这种情况下,Scala 会智能地解除这个 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

注意 Scala 控制台输出与实际 values 的区别和 def .现在,如果我尝试使用 prodA1valueval ,我会得到以下错误。
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 , Scala 使用 eta-expansion自动转换您的 methodfunction .

关于Scala Curried 类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53263123/

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