相关疑难解决方法(0)

Scala currying与部分应用的函数

我认识到,有在这里大约几个问题是什么钻营和部分应用功能,但我问他们是如何不同.举个简单的例子,这是一个用于查找偶数的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).

所以我的问题是,两者之间的主要区别是什么,何时使用一个而不是另一个?这是一个过于简单的例子来说明为什么一个人会被用在另一个上面?

functional-programming scala currying

81
推荐指数
2
解决办法
3万
查看次数

Scala中Currying vs Partial Application的实用性(如实际应用)

我试图了解在Scala中讨论部分应用程序的优点.请考虑以下代码:

  def sum(f: Int => Int) = (a: Int, b: Int) => f(a) + f(b)

  def sum2(f: Int => Int, a: Int, b: Int): Int = f(a) + f(b)

  def sum3(f: Int => Int)(a: Int, b: Int): Int = f(a) + f(b)

  val ho = sum({identity})
  val partial = sum2({ identity }, _, _)
  val currying = sum3({ identity })

  val a = currying(2, 2)
  val b = partial(2, 2)
  val c = ho(2, 2)
Run Code Online (Sandbox Code Playgroud)

那么,如果我可以轻松计算部分应用的功能,那么currying的优点是什么?

scala currying partial-application

52
推荐指数
2
解决办法
7030
查看次数

Scala中函数定义中的多个参数子句有什么意义?

我试图理解多个参数子句的这种语言特性以及为什么要使用它.例如,这两个功能之间的区别是什么?

class WTF {
    def TwoParamClauses(x : Int)(y: Int) = x + y
    def OneParamClause(x: Int, y : Int) = x + y
}

>> val underTest = new WTF
>> underTest.TwoParamClauses(1)(1) // result is '2'
>> underTest.OneParamClause(1,1) // result is '2' 
Run Code Online (Sandbox Code Playgroud)

在第4.6点Scala规范中有一些内容.看看这对你有意义.

注意:规范称这些'参数子句',但我认为有些人也可能称之为'参数列表'.

functional-programming scala currying

9
推荐指数
3
解决办法
942
查看次数