作为Scala中函数式编程的一个练习,我们必须创建一个可以进行细化的函数。我无法创造这一个,所以我看的解决方案:在Scala中了解Currying实现
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
a => b => f(a, b)
我看着它,已经能够起到一点吧,但我不完全理解它。
你能详细解释一下吗?小变量a
和b
来自哪里? =>
在a => b
的含义是什么?
作为Scala中函数式编程的一个练习,我们必须创建一个可以进行细化的函数。我无法创造这一个,所以我看的解决方案:在Scala中了解Currying实现
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(方法,斯卡拉术语),它采用一个参数,f
。 f
本身是一个函数,它有两个参数类型A
和B
,并返回C
类型的结果。方法(curry
)返回类型也是Function1[A, Function1[B, C]]
类型的函数。
哪里做小变量a和b来自
参数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
的并返回Int
,看看会发生什么:
scala> curry((x: Int, y: Int) => x + y)
res0: Int => (Int => Int) = <function1>
我们通过一个函数需要x
和y
这两个参数,类型为Int
,并返回两个值的和。作为回报,我们收到了类型为Function1[Int, Function1[Int, Int]]
的函数,该函数是取值为Int
且返回Function1
本身的函数,取值为Int
并返回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
。但由于curry
定义为A
,B
和C
三种类型,我们可以在类型彼此不同的情况下创建更复杂的函数。
“curryfication”你可能意味着咖喱。 – pedrofurla