首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中使用currying的好处

在Scala中使用currying的好处
EN

Stack Overflow用户
提问于 2014-12-25 22:54:32
回答 2查看 2.5K关注 0票数 5

我想澄清一下在scala中使用currying的好处。根据“在Scala第二版中的编程”- "currying一种编写具有多个参数列表的函数的方法。例如,def f(x: Int)(y: Int)是一个具有两个参数列表的currying函数。currying函数是通过传递几个参数列表来应用的,如:f(3)(4)。但是,也可以编写currying函数的部分应用程序,例如f(3)." "c"

与创建部分应用函数相关的一个好处如下

代码语言:javascript
复制
def multiplyCurried(x: Int)(y: Int) = x * y 
def multiply2 = multiplyCurried(2) _

但是,我们也可以使用部分应用的函数,而不使用currying。

代码语言:javascript
复制
def multiplyCurried(x: Int,y: Int) 
def multiply2 = multiplyCurried(2, _) 

你能举几个例子,在哪些方面会带来好处?

EN

回答 2

Stack Overflow用户

发布于 2014-12-26 21:30:58

当你有隐式参数时,Curry函数会变得非常有用。

以futures上的map函数为例:

代码语言:javascript
复制
map[S](f: (T) ⇒ S)(implicit executor: ExecutionContext): Future[S]

第二个参数是隐式的,这个定义允许您编写如下表达式

代码语言:javascript
复制
val f2 = f1.map(x => x)

当您在作用域中具有隐式值时。

curry的另一个有用之处是Scala代码中的一个常见模式,在该模式中,您希望将函数传递给方法(例如,它可能是一个回调函数)。

以输入流的"loan“模式为例,它允许您在不考虑适当关闭资源的情况下使用流

代码语言:javascript
复制
def withInputStream[T](opener: => InputStream)(f: InputStream => T): T = ...

withInputStream(new InputStream("hello.txt")) { inputStream =>
  readLines(inputStream)
}

这种语法在很多情况下使代码更清晰

票数 2
EN

Stack Overflow用户

发布于 2014-12-26 02:55:41

来自Coursera课程:

假设您具有以下函数:

代码语言:javascript
复制
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更改为返回另一个函数的函数:

代码语言:javascript
复制
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
  }

现在,我们可以通过以下方式定义我们拥有的函数:

代码语言:javascript
复制
def sumInts=sum(x=>x)
def sumCubes=sum(x=>x*x*x)

现在我们可以以简单的方式使用它:

代码语言:javascript
复制
sumInt(10,11) + sumCubes(3,4)

现在我们有了想要避免的sumInt和sumCubes:

代码语言:javascript
复制
sum(cube)(3,4)

因此,为了帮助在函数式编程中不编写嵌套函数,让我们重新定义sum:

代码语言:javascript
复制
def sum(f:Int=>Int)(a:Int,b:Int):Int=
  if(a>b) 0 else f(a)+sum(f)(a+1,b)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27648257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档