我正在讨论Scala样式指南中的多个参数列表.我已经认识到,有两种方式讨好,我想知道用例是什么:
def add(a:Int)(b:Int) = {a + b}
// Works
add(5)(6)
// Doesn't compile
val f = add(5)
// Works
val f = add(5)_
f(10) // yields 15
def add2(a:Int) = { b:Int => a + b }
// Works
add2(5)(6)
// Also works
val f = add2(5)
f(10) // Yields 15
// Doesn't compile
val f = add2(5)_
Run Code Online (Sandbox Code Playgroud)
风格指南错误地暗示这些是相同的,当它们显然不是时.该指南试图说明创建的curried函数,并且,虽然第二种形式不是"by-the-book"currying,但它仍然非常类似于第一种形式(尽管可以说更容易使用,因为你不需要的_)
从那些使用这些形式的人那里,对于何时使用一种形式而不是另一种形式的共识是什么?
在Scala中,我可以使用两个参数列表定义一个函数.
def myAdd(x :Int)(y :Int) = x + y
Run Code Online (Sandbox Code Playgroud)
这样可以轻松定义部分应用的功能.
val plusFive = myAdd(5) _
Run Code Online (Sandbox Code Playgroud)
但是,我可以通过定义和返回嵌套函数来完成类似的事情.
def myOtherAdd(x :Int) = {
def f(y :Int) = x + y
f _
}
Run Code Online (Sandbox Code Playgroud)
在化妆方面,我已经移动了下划线,但这仍然感觉像是在晃动.
val otherPlusFive = myOtherAdd(5)
Run Code Online (Sandbox Code Playgroud)
我应该使用什么标准来偏好一种方法呢?
一个非常简单的用例,假设我有一个Foo接受 2 个参数的类,1 个是普通参数,1 个是隐式参数。
class Foo(val msg: String, implicit val n: Int) {
def multiplier = msg * n
}
implicit val num: Int = 4
val foo = new Foo("yo")
println(foo.msg)
Run Code Online (Sandbox Code Playgroud)
我知道如果我将隐式参数移动到另一个列表(即 curried ),它会起作用class Foo(val msg: String)(implicit val n: Int)。但是,出于某种原因,我不想这样做。
有人可以解释为什么当前版本的实现不起作用吗?
我找到了一些关于什么是咖喱以及它能做些什么的好帖子.它可以将带有参数列表的函数转换为函数列表.我不清楚它在什么情况下是有用的.谁能给我一个具体的例子?