17

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 = ()

これは現在、1行の出力のみを出力します。リストの各要素で実行/パターンマッチングを行うべきではありませんか?

編集:コンパイルエラーを修正し、REPLからの出力をコピーしました。

4

3 に答える 3

26

何らかの方法で繰り返し呼び出している場合を除いて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ような関数内で繰り返し呼び出すことは、特に機能的ではありません-それはすべて副作用に関するものだからです。より慣用的なアプローチは、関数にリストを説明する文字列を作成させ、リストを1回呼び出すだけで出力されるprintlnようにすることです。これにより、副作用が1つの明確に定義された場所に保持されます。このようなものは1つのアプローチになります:

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

println(simple_fun(simple_list))
于 2012-10-24T21:04:40.037 に答える
6

また、リストの場合は、ヘッドとテールだけでなく、任意の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")
  }

それが誰かに役立つことを願っています。

于 2019-07-21T17:02:42.623 に答える
2

私は次のことがうまくいくと思います:

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に一致するため、何も見つからない場合は何も返されません。2行目は、リストのリストを識別し、flattenメソッドを呼び出して、リストのリストをフラット化します。

于 2016-07-31T17:17:53.410 に答える