Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala中的Curried函数_Scala_Currying - Fatal编程技术网

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>