Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
curriable函数,通过';返回scala中的函数=&燃气轮机';,第二,通过1个arg列表,然后是另一个arg列表_Scala_Lambda_Functional Programming_Currying - Fatal编程技术网

curriable函数,通过';返回scala中的函数=&燃气轮机';,第二,通过1个arg列表,然后是另一个arg列表

curriable函数,通过';返回scala中的函数=&燃气轮机';,第二,通过1个arg列表,然后是另一个arg列表,scala,lambda,functional-programming,currying,Scala,Lambda,Functional Programming,Currying,我开始学习一点Scala,我基本上 了解返回函数和货币的函数,但是 我已经看到了两个语法,我想做得更好 理解其中的差异,也许还有一点背后的理论 发生了什么事 在第一种方法中(使用=>),我可以通过指定 要绑定到变量x的参数。然而,当我尝试这样做的时候 在第二种方法中,编译器告诉我需要指定\uuu 第二个论点的通配符 我知道我需要做什么,但我不知道为什么我需要做 事情是这样的。谁能告诉我Scala编译器是什么吗 你在这里干什么 使用=> def add(x:Int) = (y:Int) =>

我开始学习一点Scala,我基本上 了解返回函数和货币的函数,但是 我已经看到了两个语法,我想做得更好 理解其中的差异,也许还有一点背后的理论 发生了什么事

在第一种方法中(使用
=>
),我可以通过指定 要绑定到变量
x
的参数。然而,当我尝试这样做的时候 在第二种方法中,编译器告诉我需要指定
\uuu
第二个论点的通配符

我知道我需要做什么,但我不知道为什么我需要做 事情是这样的。谁能告诉我Scala编译器是什么吗 你在这里干什么

使用
=>

def add(x:Int) = (y:Int) => x + (-y)
add: (x: Int)Int => Int

scala> def adder = add(100)   // x is bound to 100 in the returned closure
adder: Int => Int

scala> adder(1)
res42: Int = 99
第二种方法使用一个参数列表,后跟另一个参数列表

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

scala> def  adder2 = add2(100)
<console>:9: error: missing arguments for method add2;
follow this method with `_' if you want to treat it 
 as a partially applied function

       def  adder2 = add2(100)
                         ^

scala> def  adder2 = add2(100) _    // Okay, here is the '_'
adder2: Int => Int

scala> adder2(1)                    // Now i can call the curried function
res43: Int = 101
scala>defadd2(x:Int)(y:Int):Int=x+y
地址2:(x:Int)(y:Int)Int
scala>def adder2=add2(100)
:9:错误:方法add2缺少参数;
如果你想治疗它,就用``这个方法
作为部分应用的函数
def adder2=add2(100)
^
scala>def adder2=add2(100)\好的,这里是'
加法器2:Int=>Int
scala>adder2(1)//现在我可以调用curried函数了
res43:Int=101

您看到的是方法类型和函数类型之间的差异。这是一个微妙的,有时令人困惑的区别。包含对方法类型和函数类型之间差异的相当全面的解释。以下是与您的问题最相关的几点:

函数类型是(大致)一种形式
(T1,…,Tn)=>U
,是标准库中trait
函数n
的缩写

方法类型是非值类型。这意味着没有方法类型的值-没有对象,没有实例。。。方法类型是一个
def
声明-关于
def
的所有内容,除了它的主体

您不能直接指定方法执行
val

def foo(x: Int) = x
val myFooVal = foo //does not compile   
val myFooVal = foo _
eta扩展过程可以将方法转换为函数,您可以将其分配给
val

def foo(x: Int) = x
val myFooVal = foo //does not compile   
val myFooVal = foo _
是一篇更深入地探讨eta扩展的博客文章

在您的示例中,有趣的是您将方法与函数混合。这很好,但这可能是让你困惑的一部分:

def add(x:Int) = (y:Int) => x + (-y)
这是一个返回函数的方法,而此方法:

def add2(x:Int)(y:Int) =  x + y
是纯方法,与所有方法一样,可以使用eta展开将其转换为函数类型:

add2 _ //Int => (Int => Int)
add2(2) _ //Int => Int
在REPL中玩一玩,看看Scala如何以不同的方式对待这些类型,可能会有所启发:

def add(x:Int) = (y:Int) => x + (-y)
//add: (x: Int)Int => Int

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

注意这里REPL的打印输出是如何不同的。在第一个示例中,我们可以看到,
add
是一个返回类型为
Int=>Int
的函数的方法。在第二个示例中,通过第二个参数保留了方法语法。

您看到的是方法类型和函数类型之间的差异。这是一个微妙的,有时令人困惑的区别。包含对方法类型和函数类型之间差异的相当全面的解释。以下是与您的问题最相关的几点:

函数类型是(大致)一种形式
(T1,…,Tn)=>U
,是标准库中trait
函数n
的缩写

方法类型是非值类型。这意味着没有方法类型的值-没有对象,没有实例。。。方法类型是一个
def
声明-关于
def
的所有内容,除了它的主体

您不能直接指定方法执行
val

def foo(x: Int) = x
val myFooVal = foo //does not compile   
val myFooVal = foo _
eta扩展过程可以将方法转换为函数,您可以将其分配给
val

def foo(x: Int) = x
val myFooVal = foo //does not compile   
val myFooVal = foo _
是一篇更深入地探讨eta扩展的博客文章

在您的示例中,有趣的是您将方法与函数混合。这很好,但这可能是让你困惑的一部分:

def add(x:Int) = (y:Int) => x + (-y)
这是一个返回函数的方法,而此方法:

def add2(x:Int)(y:Int) =  x + y
是纯方法,与所有方法一样,可以使用eta展开将其转换为函数类型:

add2 _ //Int => (Int => Int)
add2(2) _ //Int => Int
在REPL中玩一玩,看看Scala如何以不同的方式对待这些类型,可能会有所启发:

def add(x:Int) = (y:Int) => x + (-y)
//add: (x: Int)Int => Int

def add2(x:Int)(y:Int) =  x + y
//add2: (x: Int)(y: Int)Int
注意这里REPL的打印输出是如何不同的。在第一个示例中,我们可以看到,
add
是一个返回类型为
Int=>Int
的函数的方法。在第二个示例中,通过第二个参数保留方法语法