了解 Scala 中的柯里化实现

Understanding Currying Implemention in Scala

作为 Scala 函数式编程的练习,我们必须创建一个柯里化函数。我无法创建这个,所以我查看了解决方案:

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

看了下,稍微玩了一下,还是没完全看懂。

你能详细解释一下吗?小变量 ab 来自哪里? a => b中的=>是什么意思?

curry 是一个 Higher Order Function(方法,在 Scala 术语中),它接受一个参数,ff 本身是一个函数,它有两个 AB 类型的参数,return 是 C 类型的结果。方法 (curry) return 类型也是类型 Function1[A, Function1[B, C]].

的函数

Where do the little variables a and b come from

参数ab是传递给f的两个值。 aA 类型,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 和 returning 一个 Int 的函数,看看会发生什么:

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

我们传递了一个带有两个参数的函数,xy 类型为 Int,return 是这两个值的总和。在 return 中,我们收到一个类型为 Function1[Int, Function1[Int, Int]] 的函数,该函数采用单个 Int 值并且 return 是一个 Function1 本身,采用 Int 值和 returning 一个 Int.

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

scala> res0(1)
res1: Int => Int = <function1>

正如预期的那样,调用 res0 returns a Function1[Int, Int]。如果我们将另一个 Int 传递给 res1,我们将收到总和:

scala> res1(1)
res3: Int = 2

我们也可以调用res0并传递两个参数列表来得到结果:

scala> res0(1)(1)
res2: Int = 2

在我的示例中,为简单起见,我使用 Int 作为所有参数的类型。但是由于 curry 被定义为三种类型 ABC 我们可以创建更复杂的函数,其中类型彼此不同。