3

这条线上发生了什么,被x连接到xs1但没有在任何地方定义?xxs1

case (x :: xs1, y :: ys1) =>

同样在这里,有什么价值xy以下?合并是否作为案例类的一部分被递归调用?

if( x < y) x :: merge(xs1 , ys)

这是完整的 Scala 代码:

object mergesort {

    def msort(xs: List[Int]): List[Int] = {
        val n = xs.length / 2
        if(n == 0) xs
        else {
            def merge(xs: List[Int], ys: List[Int]): List[Int] = (xs , ys) match {
            case (Nil, ys) => ys
            case (xs, Nil) => xs
            case (x :: xs1, y :: ys1) =>
                if( x < y) x :: merge(xs1 , ys)
                else y :: merge(xs, ys1)
            }


        val (fst, snd) = xs splitAt n
        merge(msort(fst), msort(snd))
        }
    }                                         //> msort: (xs: List[Int])List[Int]

    val nums = List(2, -4, 5, 7, 1)           //> nums  : List[Int] = List(2, -4, 5, 7, 1)
    msort(nums)                               //> res0: List[Int] = List(-4, 1, 2, 5, 7)

}
4

4 回答 4

2

case (x :: xs1, y :: ys1) =>  

::是模式匹配中的一种语法糖,用于解构 alistheadtail

该列表xs被解构为 headx和 tail xs

在模式匹配::中解构一个列表,与它在正常情况下实际所做的完全相反,construct一个列表。

阅读Scala 中的模式匹配点中的解构对象

于 2012-10-26T11:08:17.603 回答
1

(xs , ys) match {
     ...     
    case (x :: xs1, y :: ys1) 

是一种模式匹配,它在与断言序列匹配相同的语句中声明变量x等。xs1

上面的代码检查 xs 是否可以分解为带有 h​​eadx和 tail的序列xs1,如果可以,则使 head/tail 可用于这两个变量中的后续代码块。

要回答你的第二个问题(因为没有其他人有!),是的,merge函数(在外部函数中声明)被递归调用。

于 2012-10-26T10:27:17.233 回答
0

match-case 关键字在 scala 中用于执行模式匹配,这是一种使用案例类和提取器等多种机制匹配/分解对象的方法。谷歌 scala 模式匹配,你会找到你需要的答案。

于 2012-10-26T10:18:16.367 回答
0

这是 scala 如何允许您在 List 上进行模式匹配的示例:

scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)

scala> res0 match {
     | case h :: t => "more than two elements, " + h + " is the first"
     | case _ => "less than two elements"
     | }
res1: java.lang.String = more than two elements, 1 is the first

请注意,::左侧case的列表在其头部 ( 1) 和尾部(列表的其余部分)中分解,2, 3并将值绑定到hand t,它们仅在 first 内部创建和限定case

分解元组的方法如下:

scala> val tp = ("a", 1)
tp: (java.lang.String, Int) = (a,1)

scala> tp match {
     | case (a, b) => a + " is a string, " + b + " is a number"
     | case _ => "something missing"
     | }
res2: java.lang.String = a is a string, 1 is a number

在您问题的代码中,您在 Lists 的元组上混合了事物和模式匹配(xs , ys)

case (x :: xs1, y :: ys1)既在其两个列表中分解元组,又在其各自的头部和尾部分解其两个列表。

于 2012-10-26T10:26:30.407 回答