首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Currying:追加两个列表

Currying:追加两个列表
EN

Stack Overflow用户
提问于 2014-12-15 19:16:07
回答 1查看 86关注 0票数 3

我正在尝试理解scala中的currying。这段代码接受两个列表并附加它们。

代码语言:javascript
复制
  def append(as:List[Int],bs:List[Int]):List[Int]=as match{

  case Nil=>bs
  case x::xs=> x::append(xs,bs)

}

但是如果我想写一个currying版本的话:

代码语言:javascript
复制
def cappend(as:List[Int])(bs:List[Int])=as match{
     case Nil=>bs
     case x::xs=> x::cappend(xs,bs)
   }

这是正确的吗?

EN

回答 1

Stack Overflow用户

发布于 2014-12-15 19:53:40

在currying中,您可以定义部分应用的函数,因此不需要一次传递所有参数。在该示例中,请考虑以下更正:

代码语言:javascript
复制
def cappend(as:List[Int])(bs:List[Int]): List[Int] = as match {
     case Nil   => bs
     case x::xs => x::cappend(xs)(bs)
   }

也就是说,每个参数都包含在圆括号中(而且递归函数需要返回类型,递归调用缺少前缀c)。然后,我们定义了一个部分定义的函数

代码语言:javascript
复制
val a = cappend(List(1,2)) _
a: List[Int] => List[Int] = <function1>

这将向作为第二个参数提供的任何List[Int]附加List(1,2)。例如,

代码语言:javascript
复制
a(List(3,4))
res1: List[Int] = List(1, 2, 3, 4)

还要注意,我们可以具有更通用的类型签名,不仅用于Int的列表,

代码语言:javascript
复制
def cappend[T](as:List[T])(bs:List[T]): List[T]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27482826

复制
相关文章

相似问题

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