curriable函数,通过';返回scala中的函数=&燃气轮机';,第二,通过1个arg列表,然后是另一个arg列表
我开始学习一点Scala,我基本上 了解返回函数和货币的函数,但是 我已经看到了两个语法,我想做得更好 理解其中的差异,也许还有一点背后的理论 发生了什么事 在第一种方法中(使用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) =>
=>
),我可以通过指定
要绑定到变量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
的函数的方法。在第二个示例中,通过第二个参数保留方法语法