gpt4 book ai didi

scala - scala中的 curry 函数

转载 作者:行者123 更新时间:2023-12-04 15:23:24 24 4
gpt4 key购买 nike

我有下一个方法的定义:

def add1(x: Int, y: Int) = x + y

def add2(x: Int)(y: Int) = x + y

第二个是第一个的 curry 版本。然后,如果我想部分应用第二个函数,我必须写 val res2 = add2(2) _ .一切安好。下一个我要 add1要 curry 的功能。我写
val curriedAdd = (add1 _).curried

我说得对吗 curriedAdd 类似于 add2 ?
但是当我尝试部分应用 curriedAdd以这种方式 val resCurried = curriedAdd(4) _我得到一个编译错误。然后我将其修复为
val resCurried = curriedAdd(4)

为什么 Functions.curried 的结果与添加函数的 curry 版本不同(来自 add2 )?

最佳答案

首先curriedAddadd2 _ 相同而不是 add2 . add2 只是一种方法。

scala> curriedAdd
res52: Int => (Int => Int) = <function1>

scala> add2 _
res53: Int => (Int => Int) = <function1>

关于第二个问题。我认为原因如下。正在做
scala> val i = curriedAdd(23)
i: Int => Int = <function1>

scala> i _
res54: () => Int => Int = <function0>

scala> curriedAdd(23) _
<console>:10: error: _ must follow method; cannot follow Int => Int
curriedAdd(23) _
curriedAdd(23) _不起作用。让我们看一下 scala 手册(§6.7)-

The expression e _ is well-formed if e is of method type or if e is a call-by-name parameter. If e is a method with parameters, e _ represents e converted to a function type by eta expansion (§6.26.5). If e is a parameterless method or call-by-name parameter of type =>T , e _ represents the function of type () => T , which evaluates e when it is applied to the empty parameterlist ().



请记住,它仅评估它是方法还是按名称调用的参数。在 curriedAdd(23) _ ,它不会评估 curriedAdd(23) 而是检查它是方法还是名称调用。它不是方法,也不是名称调用参数。

它不是按名称,因为按名称是变量的属性。在评估 curriedAdd(23) 之后,您会在上面得到一个别名参数。但是 curriedAdd(23)本身不是一个名称变量。因此错误(理想情况下编译器应该已经隐藏它)。请注意,以下工作:
scala> curriedAdd(23)
res80: Int => Int = <function1>

scala> res80 _
res81: () => Int => Int = <function0>

上述工作是因为 res80 _ , 你在这里申请 _到按名称调用的参数,因此进行转换。

关于scala - scala中的 curry 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18398574/

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