scala中的Curried函数
我对下一种方法有一个定义:scala中的Curried函数,scala,currying,Scala,Currying,我对下一种方法有一个定义: def add1(x: Int, y: Int) = x + y def add2(x: Int)(y: Int) = x + y 第二个是第一个的咖喱版本。然后,如果我想部分应用第二个函数,我必须编写val res2=add2(2)u。一切都很好。下一步,我希望将add1函数转换为curry。我写 val curriedAdd = (add1 _).curried curriedAdd类似于add2,我说得对吗? 但是,当我试图以这种方式部分应用curried
def add1(x: Int, y: Int) = x + y
def add2(x: Int)(y: Int) = x + y
第二个是第一个的咖喱版本。然后,如果我想部分应用第二个函数,我必须编写val res2=add2(2)u
。一切都很好。下一步,我希望将add1
函数转换为curry。我写
val curriedAdd = (add1 _).curried
curriedAdd类似于add2
,我说得对吗?
但是,当我试图以这种方式部分应用curriedAdd
时,我得到了一个编译错误。然后我把它修好
val resCurried = curriedAdd(4)
<> >为什么<代码>函数?CurryE不同于Currud版本的Add函数(从<代码> ADD2)?< /P> < P>回答这个问题,让我们来看看RepL.< /P> 首先,我们像您一样定义这两个函数
scala> def add1(x: Int, y: Int) = x + y
add1: (x: Int, y: Int)Int
scala> def add2(x: Int)(y: Int) = x + y
add2: (x: Int)(y: Int)Int
我们定义了两个函数。第一个参数需要在一个参数列表中包含两个参数。第二个需要两个参数,每个参数都在自己的参数列表中。结果类型相同。
让我们继续
scala> val curriedAdd = (add1 _).curried
curriedAdd: Int => (Int => Int) = <function1>
首先,
curriedAdd
与add2
相同,而不是add2
。add2只是一种方法
scala> curriedAdd
res52: Int => (Int => Int) = <function1>
scala> add2 _
res53: Int => (Int => Int) = <function1>
上述操作之所以有效,是因为
res80
,这里您将
应用于按名称调用参数,并因此进行转换。这并不能回答问题<代码>curriedAdd(4)不起作用,但val i=curriedAdd(4);问题是:“为什么a Functions.curried的结果不同于add function(来自add2)的curried版本?”我想我已经指出了这些差异。
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) _
scala> curriedAdd(23)
res80: Int => Int = <function1>
scala> res80 _
res81: () => Int => Int = <function0>