我正在阅读Scala中的函数式编程,并通过不同的练习。我遇到了currying。
有人可以向我解释一下这个有问题的功能吗?这是如何工作的?我似乎能理解这段代码。与我在不同的博客上看到的关于Scala中的currying的那些相比。
def curry[A,B,C](f: (A, B) => C): A => (B => C) = a => b => f(a,b)
是来自a =>的a
b => f(a,b)一个函数,如果是这样,它的论点是什么?
还要更新这是什么意思? a
中的a => b => f(a,b)
表示什么?是一个函数,它将返回一个名为b的函数,它接受一个参数并返回一个函数?
答案 0 :(得分:1)
我假设您理解currying的概念,并且类型定义对您有意义:A => B => C
。
实施是:a => b => f(a,b)
,您可以将其读作:
... = { a =>
{ b =>
{ f(a,b) }
}
}
因此,a
是接受为A => (B => C)
类型函数输入的参数。此函数返回第二个函数 - 类型为B => C
,需要b:B
并将f
应用于这两个函数。
编辑:如果它可以帮助您理解,您可以使用这个非常详细的版本:
def curry[A,B,C](f: (A, B) => C): A => (B => C) = {
def aToBToC(a: A): B => C = {
def bToC(b: B): C = {
f(a,b)
}
bToC
}
aToBToC
}
看看我如何在嵌套作用域中定义私有函数? (我没有在REPL中尝试过,也许有一个错字,但你明白了。)
答案 1 :(得分:1)
您定义了一个函数 curry ,它将另一个函数作为参数。该函数的返回类型为A => (B => C)
,也是A
到B => C
的函数。
之后,您定义了A => (B => C)
的实现,同样针对给定a
返回函数b => f(a,b)
。
示例:强>
def plus(a: Int, b:Int): Int = a + b
plus
的咖喱版:
scala> def plusC(a:Int): Int => Int = plus(a, _)
plusC: (a: Int)Int => Int
scala> plusC(1)
res4: Int => Int = <function1>
scala> res4(10)
res5: Int = 11
答案 2 :(得分:1)
这是不是一个curried函数。这是一种咖喱方法(注意:函数和方法在Scala中是非常不同的概念),即做 curry的方法。它的返回值是一个curried函数;它接受两个参数的函数,返回一个curried函数。
答案 3 :(得分:0)
def curry[A,B,C]
不是curried函数本身,它只是展示了如何将带有两个参数f: (A, B) => C
的函数转换为curried函数A => (B => C)
。 a => b => f(a, b)
表示该函数接受参数a
并返回函数b => f(a, b)
,后者又返回最终值f(a, b)
。