Currying:附加两个列表

时间:2014-12-15 11:16:07

标签: list scala append currying

我试图理解scala中的currying。该代码采用两个列表并附加它们。

  def append(as:List[Int],bs:List[Int]):List[Int]=as match{

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

}

但如果我想写它的currying版本:

def cappend(as:List[Int])(bs:List[Int])=as match{
     case Nil=>bs
     case x::xs=> x::cappend(xs,bs)
   }

那会是正确的吗?

1 个答案:

答案 0 :(得分:3)

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

def cappend(as:List[Int])(bs:List[Int]): List[Int] = as match {
     case Nil   => bs
     case x::xs => x::cappend(xs)(bs)
   }

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

val a = cappend(List(1,2)) _
a: List[Int] => List[Int] = <function1>

会将List(1,2)附加到作为第二个参数提供的List[Int]中。例如,

a(List(3,4))
res1: List[Int] = List(1, 2, 3, 4)

另请注意,我们可以使用更通用的类型签名,不仅适用于Int

的列表
def cappend[T](as:List[T])(bs:List[T]): List[T]