我对下一个方法有一个定义:
def add1(x: Int, y: Int) = x + y
def add2(x: Int)(y: Int) = x + y
第二个是第一个的咖喱版。然后,如果要部分应用第二个功能,则必须编写val res2 = add2(2) _
。一切都好。接下来,我要对add1
函数进行处理。我写的
val curriedAdd = (add1 _).curried
我可以说curriedAdd与之类似add2
吗?但是,当我尝试以curriedAdd
这种方式部分申请时,val resCurried = curriedAdd(4) _
出现编译错误。然后我将其修复为
val resCurried = curriedAdd(4)
为什么a的结果Functions.curried
与add function(from add2
)的当前版本不同?
首先curriedAdd
是add2 _
和不是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节)-
如果e属于方法类型或e是按名称调用参数,则表达式e _格式正确。如果e是带有参数的方法,则e _表示e通过eta扩展转换为函数类型(第6.26.5节)。如果e是类型=> T的无参数方法或按名称调用参数,则e _表示类型()=> T的函数,当将e应用于空参数列表()时,该函数将求值e。
请记住,它仅评估它是方法还是按名称调用参数。在中curriedAdd(23) _
,它不评估curriedAdd(23),但会检查它是否是方法或按名称调用。它既不是方法也不是“按名称呼叫”参数。
它不是按名称的,因为按名称是变量的属性。在评估之后,您会在上面得到一个by-name参数,curriedAdd(23)
但curriedAdd(23)
它本身不是一个by-name变量。因此,该错误(理想情况下,编译器应该已掩盖了该错误)。请注意以下工作:
scala> curriedAdd(23)
res80: Int => Int = <function1>
scala> res80 _
res81: () => Int => Int = <function0>
上面的方法起作用是因为res80 _
,这里您要应用_
一个按名字呼叫的参数,因此可以进行转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句