理解Scala中的Currying实现

时间:2016-07-01 16:20:45

标签: scala currying

作为Scala中功能编程的练习,我们必须创建一个可以实现细化的功能。我无法创建这个,所以我看了解决方案:

def curry[A,B,C](f: (A, B) => C): A => (B => C) =
  a => b => f(a, b)

我看着它,已经能够用它玩一点,但我不完全理解它。

你能详细解释一下吗?小变量ab来自何处? =>a => b的含义是什么?

1 个答案:

答案 0 :(得分:7)

curryHigher Order Function(Scala术语中的方法),它采用单个参数ff本身是一个函数,它接受AB类型的两个参数,并返回类型C的结果。方法(curry)返回类型也是类型Function1[A, Function1[B, C]]的函数。

  

小变量a和b来自哪里

参数ab是传递给f的两个值。 a的类型为A,b的类型为B,属于anonymous function syntax。将它们视为未来值的占位符,将在调用方法时使用。

我们在示例中使用curry

scala> def curry[A,B,C](f: (A, B) => C): A => (B => C) =
     |   a => b => f(a, b)
curry: [A, B, C](f: (A, B) => C)A => (B => C)

我们将传递一个函数,其中包含两个Int并返回一个Int,看看会发生什么:

scala> curry((x: Int, y: Int) => x + y)
res0: Int => (Int => Int) = <function1>

我们传递了一个函数,该函数接受x类型的yInt两个参数,并返回两个值的总和。作为回报,我们收到了Function1[Int, Function1[Int, Int]]类型的函数,该函数采用单个Int值并返回Function1本身,获取Int值并返回{{ 1}}。

现在让我们将Int值传递给Int时会发生什么:

res0

正如预期的那样,调用scala> res0(1) res1: Int => Int = <function1> 会返回res0。如果我们将另一个Function1[Int, Int]传递给Int,我们会收到总和:

res1

我们也可以调用scala> res1(1) res3: Int = 2 并传递两个参数列表来获得结果:

res0

在我的示例中,为简单起见,我使用scala> res0(1)(1) res2: Int = 2 作为所有参数的类型。但由于Int是针对三种类型curryAB定义的,因此我们可以创建更复杂的函数,其中类型彼此不同。