簡體   English   中英

Scala中列表上的模式匹配

[英]Pattern matching on a list in Scala

關於Scala列表中的模式匹配,我有點困惑。

例如。

    val simplelist: List[Char] = List('a', 'b', 'c', 'd')

    //> simplelist  : List[Char] = List(a, b, c, d)

    def simple_fun(list: List[Char]) = list match {
           case (x:Char) :: (y:List[Char]) => println(x)
           case _ => Nil
     }                                                 
   //> simple_fun: (list: List[Char])Any

   simple_fun(simplelist)                            

   //> a
   //| res0: Any = ()

目前只打印一行輸出。 它是否應該在列表的每個元素上運行/模式匹配?

編輯:我修復了編譯錯誤並復制了REPL的輸出。

除非你以某種方式反復調用simple_fun ,否則你所擁有的將匹配第一個元素,而不是更多。 為了使它與整個列表匹配,你可以讓simple_fun以遞歸方式調用自身,如下所示:

val simplelist: List[Char] = List('a', 'b', 'c', 'd')

def simple_fun(list: List[Char]): List[Nothing] = list match {
  case x :: xs => {
    println(x)
    simple_fun(xs)
  }
  case _ => Nil 
}

注意我還省略了一些類型,因為Scala編譯器可以推斷它們,使您的代碼更簡潔,更易讀。

作為一個小小的注意事項,在函數內部重復調用println並不是特別有用 - 因為它只是副作用。 更慣用的方法是讓函數構造一個描述列表的字符串,然后通過對println的單個調用輸出 - 因此副作用保存在一個明確定義的位置。 這樣的事情將是一種方法:

def simple_fun(list: List[Char]):String = list match {
  case x :: xs => x.toString + simple_fun(xs)
  case Nil => ""
}

println(simple_fun(simple_list))

我認為以下應該有效:

def flatten(l: List[_]): List[Any] = l match {
  case Nil => Nil
  case (head: List[_]) :: tail => flatten(head) ::: flatten(tail)
  case head :: tail => head :: flatten(tail)
}

第一行是Nil的匹配,所以如果我們找不到任何返回的東西。 第二行將識別列表列表並調用展平方法並展平列表列表。

我還想提一下,列表的情況不僅可以分為頭部和尾部,還可以划分任意N個列表元素:

def anyFunction(list: List[Int]): Unit =
  list match {
        // ...methods that have already been shown
      case first :: second :: Nil  => println(s"List has only 2 elements: $first and $second")
      case first :: second :: tail => println(s"First: $first \nSecond: $second \nTail: $tail")
  }

希望它對某人有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM