我认识到,有在这里大约几个问题是什么钻营和部分应用功能,但我问他们是如何不同.举个简单的例子,这是一个用于查找偶数的curry函数:
def filter(xs: List[Int], p: Int => Boolean): List[Int] =
if (xs.isEmpty) xs
else if (p(xs.head)) xs.head :: filter(xs.tail, p)
else filter(xs.tail, p)
def modN(n: Int)(x: Int) = ((x % n) == 0)
Run Code Online (Sandbox Code Playgroud)
所以你可以编写以下内容来使用它:
val nums = List(1,2,3,4,5,6,7,8)
println(filter(nums, modN(2))
Run Code Online (Sandbox Code Playgroud)
返回:List(2,4,6,8)
.但我发现我可以用这种方式做同样的事情:
def modN(n: Int, x: Int) = ((x % n) == 0)
val p = modN(2, _: Int)
println(filter(nums, p))
Run Code Online (Sandbox Code Playgroud)
还返回:List(2,4,6,8)
.
所以我的问题是,两者之间的主要区别是什么,何时使用一个而不是另一个?这是一个过于简单的例子来说明为什么一个人会被用在另一个上面?
在Scala中,可以像这样编写(curried?)函数
def curriedFunc(arg1: Int) (arg2: String) = { ... }
Run Code Online (Sandbox Code Playgroud)
上述curriedFunc
函数定义与两个参数列表和单个参数列表中具有多个参数的函数之间有何区别:
def curriedFunc(arg1: Int, arg2: String) = { ... }
Run Code Online (Sandbox Code Playgroud)
从数学的角度来看,这是(curriedFunc(x))(y)
,curriedFunc(x,y)
但我可以写def sum(x) (y) = x + y
,同样的def sum2(x, y) = x + y
我只知道一个区别 - 这是部分应用的功能.但这两种方式对我来说都是等同的.
还有其他差异吗?
我有一个代码
object App {
def main(args: Array[String]) = print {CL().f()()()}
}
case class CL() {
def f()()() = 1
}
Run Code Online (Sandbox Code Playgroud)
你可以看到一个方法调用f()()()
.但是如果我执行f()
它会返回相同的结果.
那么在f()()()
和f()
Scala之间有什么区别?
一个非常简单的用例,假设我有一个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)
。但是,出于某种原因,我不想这样做。
有人可以解释为什么当前版本的实现不起作用吗?
可能重复:
Scala中可变长度参数列表的类型是什么?
我最近在参数列表上发现了这篇文章:https://stackoverflow.com/a/4684598/1287554,我发现它真的很有趣.
我也理解下面给出的用例:
def fn(x:Int*) = x.sum //> fn: (x: Int*)Int
fn(1,2,3) //> res0: Int = 6
Run Code Online (Sandbox Code Playgroud)
我看到的显而易见的解释是,它是以下代码的某种语法糖:
def fn(x:List[Int]) = x.sum //> fn: (x: List[Int])Int
fn(List(1,2,3)) //> res0: Int = 6
Run Code Online (Sandbox Code Playgroud)
但是我找不到任何关于它们的文档.有人能指出一些链接来解释这种类型的功能参数吗?此外,他们被称为参数列表或其他什么?也许我找不到任何东西的原因是因为我用错误的名字搜索?