List 咖喱:附加两个列表

List 咖喱:附加两个列表,list,scala,append,currying,List,Scala,Append,Currying,我正在努力理解scala的咖喱。代码获取两个列表并附加它们 def append(as:List[Int],bs:List[Int]):List[Int]=as match{ case Nil=>bs case x::xs=> x::append(xs,bs) } 但如果我想写它的咖喱版本: def cappend(as:List[Int])(bs:List[Int])=as match{ case Nil=>bs case x::xs=&

我正在努力理解scala的咖喱。代码获取两个列表并附加它们

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

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

}
但如果我想写它的咖喱版本:

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

这是否正确?

在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>
还要注意的是,对于
Int
列表,我们可以有一个更通用的类型签名

def cappend[T](as:List[T])(bs:List[T]): List[T]

是的,唯一需要的是x::append(xs)(bs)而不是x::append(xs,bs)
def cappend[T](as:List[T])(bs:List[T]): List[T]