2012-10-24 9 views
8

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

これは現在、1行の出力のみを出力します。 Listの各要素に対してパターンマッチが実行されませんか?

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

+0

どうやってsimple_funを呼びますか – smk

+0

@SajitKunnumkalあなたの質問に答えるために投稿を編集しました。 –

答えて

22

何らかの方法で繰り返しsimple_funを呼び出している場合を除き、そこにあるものは最初の要素と一致します。それは全体のリストに一致するように取得するには、このように、再帰的に自分自身を呼び出すためにsimple_funを得ることができます:Scalaのコンパイラはそれらを推測することができますよう

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 
} 

注意私はまた、であなたを残して、タイプの一部を残してきました複雑で読みにくいコードです。

小さいノートとして、そのような機能の中で繰り返し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)) 
+1

ありがとうございます。したがって、パターンマッチはリスト内の各要素ではなく1回だけ呼び出されます。また、再帰的に呼び出すことができるように、戻り値の型(Unit)をsimple_funに明示的に追加する必要がありました。 –

+0

問題ありません!はい、私は(戻り値の型を必要とする再帰的な関数について)答えに明確な説明を追加しているので、それを修正するために編集しました。 coursera.orgのscalaコースに従っていますか? – Russell

+0

私はprintlnが副作用をもたらすことを理解します。私はこの単純な例のためだけに追加しました。もし純粋に機能したいのであれば、それは実際のコードの一部ではないはずです。 –

-1

私は次のように動作するはずだと思う:

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) 
} 

最初の行は、無記号の一致であるので、我々は何が何も返さない見つからない場合。 2行目はList of Listsを特定し、flattenメソッドを呼び出してリストのリストをフラット化します。

+1

この質問は回答されており、回答は4年前に受け入れられました。あなたの答えはパーティーに少し遅れただけでなく、ポイントを逃してしまいます。質問は、単純なパターンマッチングに関するものでした。ネストされたリストについての質問には何もありません。 – jwvh

関連する問題