2016-07-01 33 views
1

作为Scala中函数式编程的一个练习,我们必须创建一个可以进行细化的函数。我无法创造这一个,所以我看的解决方案:在Scala中了解Currying实现

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

我看着它,已经能够起到一点吧,但我不完全理解它。

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

+1

“curryfication”你可能意味着咖喱。 – pedrofurla

回答

7

curry是一个Higher Order Function(方法,斯卡拉术语),它采用一个参数,ff本身是一个函数,它有两个参数类型AB,并返回C类型的结果。方法(curry)返回类型也是Function1[A, Function1[B, C]]类型的函数。

哪里做小变量a和b来自

参数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的并返回Int,看看会发生什么:

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

我们通过一个函数需要xy这两个参数,类型为Int,并返回两个值的和。作为回报,我们收到了类型为Function1[Int, Function1[Int, Int]]的函数,该函数是取值为Int且返回Function1本身的函数,取值为Int并返回Int

现在让我们通过一个Intres0会发生什么:

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

正如预期的那样,调用res0回报Function1[Int, Int]。如果我们通过另一个Intres1,我们会收到总和:

scala> res1(1) 
res3: Int = 2 

我们也可以调用res0和传递两个参数列表取得的结果:

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

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