作为Scala中功能编程的练习,我们必须创建一个可以实现细化的功能。我无法创建这个,所以我看了解决方案:
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
a => b => f(a, b)
我看着它,已经能够用它玩一点,但我不完全理解它。
你能详细解释一下吗?小变量a
和b
来自何处? =>
中a => b
的含义是什么?
答案 0 :(得分:7)
curry
是Higher Order Function(Scala术语中的方法),它采用单个参数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
值并返回{{ 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
是针对三种类型curry
,A
和B
定义的,因此我们可以创建更复杂的函数,其中类型彼此不同。