我想澄清一下在scala中使用currying的好处。根据“在Scala第二版中的编程”- "currying一种编写具有多个参数列表的函数的方法。例如,def f(x: Int)(y: Int)是一个具有两个参数列表的currying函数。currying函数是通过传递几个参数列表来应用的,如:f(3)(4)。但是,也可以编写currying函数的部分应用程序,例如f(3)." "c"
与创建部分应用函数相关的一个好处如下
def multiplyCurried(x: Int)(y: Int) = x * y
def multiply2 = multiplyCurried(2) _但是,我们也可以使用部分应用的函数,而不使用currying。
def multiplyCurried(x: Int,y: Int)
def multiply2 = multiplyCurried(2, _) 你能举几个例子,在哪些方面会带来好处?
发布于 2014-12-26 21:30:58
当你有隐式参数时,Curry函数会变得非常有用。
以futures上的map函数为例:
map[S](f: (T) ⇒ S)(implicit executor: ExecutionContext): Future[S]第二个参数是隐式的,这个定义允许您编写如下表达式
val f2 = f1.map(x => x)当您在作用域中具有隐式值时。
curry的另一个有用之处是Scala代码中的一个常见模式,在该模式中,您希望将函数传递给方法(例如,它可能是一个回调函数)。
以输入流的"loan“模式为例,它允许您在不考虑适当关闭资源的情况下使用流
def withInputStream[T](opener: => InputStream)(f: InputStream => T): T = ...
withInputStream(new InputStream("hello.txt")) { inputStream =>
readLines(inputStream)
}这种语法在很多情况下使代码更清晰
发布于 2014-12-26 02:55:41
来自Coursera课程:
假设您具有以下函数:
def sum(f:Int=>Int, a:Int, b:Int) = f(a) + f(b)
def sumInts(a:Int,b:Int)=sum(x=>x,a,b)
def sumCubes(a:Int,b:Int)=sum(x=>x*x*x,a,b)将sum更改为返回另一个函数的函数:
def sum(f:Int=>Int):(Int,Int)=>Int={
def sumF(a:Int,b:Int):Int=
if(a>b) 0 else f(a)+ sumF(a+1,b)
sumF
}现在,我们可以通过以下方式定义我们拥有的函数:
def sumInts=sum(x=>x)
def sumCubes=sum(x=>x*x*x)现在我们可以以简单的方式使用它:
sumInt(10,11) + sumCubes(3,4)现在我们有了想要避免的sumInt和sumCubes:
sum(cube)(3,4)因此,为了帮助在函数式编程中不编写嵌套函数,让我们重新定义sum:
def sum(f:Int=>Int)(a:Int,b:Int):Int=
if(a>b) 0 else f(a)+sum(f)(a+1,b)https://stackoverflow.com/questions/27648257
复制相似问题