gpt4 book ai didi

Scala 实例 - 柯里化(Currying)问题

转载 作者:行者123 更新时间:2023-12-01 07:21:45 25 4
gpt4 key购买 nike

不确定如何正确地提出问题,第 69 页的 Scala by Example 书中的合并排序示例存在柯里化(Currying)问题。该函数定义如下:

def msort[A](less: (A, A) => Boolean)(xs: List[A]): List[A] = {
def merge(xs1: List[A], xs2: List[A]): List[A] =
if (xs1.isEmpty) xs2
else if (xs2.isEmpty) xs1
else if (less(xs1.head, xs2.head)) xs1.head :: merge(xs1.tail, xs2)
else xs2.head :: merge(xs1, xs2.tail)
val n = xs.length/2
if (n == 0) xs
else merge(msort(less)(xs take n), msort(less)(xs drop n))
}

然后有一个示例说明如何通过柯里化(Currying)从中创建其他函数:

val intSort = msort((x : Int, y : Int) => x < y)
val reverseSort = msort((x:Int, y:Int) => x > y)

然而,这两行给我关于参数数量不足的错误。如果我这样做:

val intSort = msort((x : Int, y : Int) => x < y)(List(1, 2, 4))
val reverseSort = msort((x:Int, y:Int) => x > y)(List(4, 3, 2))

它会起作用的。为什么?有人可以解释吗?看起来这本书真的过时了,因为它不是示例中出现这种不一致的第一个案例。谁能指出更真实的东西来阅读? (最好是免费的电子书)。

最佳答案

我的编译器(2.9.1)同意,这里似乎有错误,但编译器确实告诉你该怎么做:

error: missing arguments for method msort in object $iw;
follow this method with `_' if you want to treat it as a partially applied function

所以,这是可行的:

val intSort = msort((x : Int, y : Int) => x < y) _

由于 intSort 的类型被推断出来,编译器似乎不知道您是否打算部分应用,或者您是否遗漏了参数。

_当编译器可以从预期类型推断部分应用函数是预期的类型时,可以省略。所以这也有效:

val intSort: List[Int] => List[Int] = msort((x: Int, y: Int) => x < y)

这显然更冗长,但更多时候你会利用它而不需要任何额外的样板,例如如果 msort((x: Int, y: Int) => x < y)是参数类型已知为 List[Int] => List[Int] 的函数的参数.


编辑: Scala Language Specification 当前版本的第 181 页提到自 Scala 2.0 以来对部分应用方法到函数的隐式转换规则的收紧。有一个无效代码示例与Scala by Example 中的代码非常相似,它被描述为“先前合法的代码”。

关于Scala 实例 - 柯里化(Currying)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8605904/

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