了解 Scala 中的柯里化实现
Understanding Currying Implemention in Scala
作为 Scala 函数式编程的练习,我们必须创建一个柯里化函数。我无法创建这个,所以我查看了解决方案:
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
a => b => f(a, b)
看了下,稍微玩了一下,还是没完全看懂。
你能详细解释一下吗?小变量 a
和 b
来自哪里? a => b
中的=>
是什么意思?
curry
是一个 Higher Order Function(方法,在 Scala 术语中),它接受一个参数,f
。 f
本身是一个函数,它有两个 A
和 B
类型的参数,return 是 C
类型的结果。方法 (curry
) return 类型也是类型 Function1[A, Function1[B, C]]
.
的函数
Where do the little variables a and b come from
参数a
和b
是传递给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
和 returning 一个 Int
的函数,看看会发生什么:
scala> curry((x: Int, y: Int) => x + y)
res0: Int => (Int => Int) = <function1>
我们传递了一个带有两个参数的函数,x
和 y
类型为 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
被定义为三种类型 A
、B
和 C
我们可以创建更复杂的函数,其中类型彼此不同。
作为 Scala 函数式编程的练习,我们必须创建一个柯里化函数。我无法创建这个,所以我查看了解决方案:
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
a => b => f(a, b)
看了下,稍微玩了一下,还是没完全看懂。
你能详细解释一下吗?小变量 a
和 b
来自哪里? a => b
中的=>
是什么意思?
curry
是一个 Higher Order Function(方法,在 Scala 术语中),它接受一个参数,f
。 f
本身是一个函数,它有两个 A
和 B
类型的参数,return 是 C
类型的结果。方法 (curry
) return 类型也是类型 Function1[A, Function1[B, C]]
.
Where do the little variables a and b come from
参数a
和b
是传递给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
和 returning 一个 Int
的函数,看看会发生什么:
scala> curry((x: Int, y: Int) => x + y)
res0: Int => (Int => Int) = <function1>
我们传递了一个带有两个参数的函数,x
和 y
类型为 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
被定义为三种类型 A
、B
和 C
我们可以创建更复杂的函数,其中类型彼此不同。