gpt4 book ai didi

scala - curry 更新方法

转载 作者:行者123 更新时间:2023-12-01 15:13:57 25 4
gpt4 key购买 nike

我正在尝试像这样柯里化(Currying)应用和更新方法:

def apply(i: Int)(j: Int) = matrix(i)(j)
def update(i: Int, j: Int, value: Int) =
new Matrix(n, m, (x, y) => if ((i,j) == (x,y)) value else matrix(x)(y))

Apply 方法工作正常,但 update 方法报错:

scala> matrix(2)(1) = 1
<console>:16: error: missing arguments for method apply in class Matrix;
follow this method with `_' if you want to treat it as a partially applied function
matrix(2)(1) = 1

直接调用update(2)(1)(1)是可以的,所以是转换成update方法,不能正常工作。我的错误在哪里?

最佳答案

update 调用中的赋值语法脱糖将赋值左轴上的单个参数列表与赋值右轴上的值连接到 的第一个参数 block code>update 方法定义,不管 update 方法定义有多少其他参数 block 。虽然这种转换在某种意义上将单个参数 block 拆分为两个(一个在左轴,一个在分配的右轴),但它不会以您想要的方式进一步拆分左侧参数 block 。

我还认为您对显示的显式调用 update 的示例有误。这不会根据您提供的 update 定义进行编译,

scala> class Matrix { def update(i: Int, j: Int, value: Int) = (i, j, value) }
defined class Matrix

scala> val m = new Matrix
m: Matrix = Matrix@37176bc4

scala> m.update(1)(2)(3)
<console>:10: error: not enough arguments for method update: (i: Int, j: Int, value: Int)(Int, Int, Int).
Unspecified value parameters j, value.
m.update(1)(2)(3)
^

我怀疑在您的实验过程中,您实际上是这样定义更新的,

scala> class Matrix { def update(i: Int)(j: Int)(value: Int) = (i, j, value) }
defined class Matrix

更新脱糖确实适用于此定义,但可能不是您期望的方式:如上所述,它仅适用于第一个参数列表,导致像这样的构造,

scala> val m = new Matrix
m: Matrix = Matrix@39741f43

scala> (m() = 1)(2)(3)
res0: (Int, Int, Int) = (1,2,3)

这里初始的一个参数 block 被拆分为分配的左轴上的一个空参数 block (即 ())和右轴上的一个参数 block (即。 1)。然后是原始定义中的其余参数 block 。

如果您对这种行为感到惊讶,您 won't be the first .

您所追求的语法可以通过稍微不同的途径实现,

scala> class Matrix {
| class MatrixAux(i : Int) {
| def apply(j : Int) = 23
| def update(j: Int, value: Int) = (i, j, value)
| }
|
| def apply(i: Int) = new MatrixAux(i)
| }
defined class Matrix

scala> val m = new Matrix
m: Matrix = Matrix@3af30087

scala> m(1)(2) // invokes MatrixAux.apply
res0: Int = 23

scala> m(1)(2) = 3 // invokes MatrixAux.update
res1: (Int, Int, Int) = (1,2,3)

关于scala - curry 更新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767718/

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