lambda函数的Scala语法

时间:2012-07-23 06:24:22

标签: scala

所以这个编译:

def compress[T](list: List[T]): List[(T, Int)] =
{
    list.zipWithIndex.filter { tuple => (tuple._2 == 0) || (tuple._1 != list(tuple._2 - 1)) }
}

这不编译:

def compress[T](list: List[T]): List[(T, Int)] =
{
    list.zipWithIndex.filter { (_._2 == 0) || (_._1 != list(_._2 - 1)) }
}

为什么?

2 个答案:

答案 0 :(得分:14)

_并不代表x。相反,它意味着“使用参数列表中的下一个参数”或“将此方法转换为函数对象”,具体取决于上下文。在你的情况下,第二个是无意义的,因为你想要一个变量的函数但是使用_三次。

提示:使用xt。拼写tuple不太可能对任何人有帮助,单字母版本与_一样紧凑。更好的是,

filter { case (t,i) => (i==0) || (t != list(i-1)) }

答案 1 :(得分:2)

您的第二个示例扩展为:

def compress[T](list: List[T]): List[(T, Int)] =
{
    list.zipWithIndex.filter { ((x => x._2) == 0) || ((y => y._1) != list((z => z._2) - 1)) }
}
编译器正确拒绝的

是荒谬的。包含_的调用会扩展为围绕调用的lambda,而不是其他内容。