kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

forでパターンマッチを使う

あまり知られていないが、実はScalaのfor式の<-の左の部分にはパターンを書くことができる。たとえば、SomeとNoneが入ったリストから、Someな要素だけを抽出してprintするというコードは次のように書くことができる。

val list = List(Some(1), None, Some(3), None, Some(5))
for(Some(v) <- list) println(v)

ここで、Noneが来たときの処理が書かれていないことに、アレ?と思われる方が居るかもしれない。この事に対する答えは簡単で、上記のfor式はおおむね次のような、filterによってパターンにマッチする要素だけを抽出する式を間に挟むため、パターンにマッチしない要素は単純に処理されないのだ。

val list = List(Some(1), None, Some(3), None, Some(5))
list.filter{ case Some(v) => true case _ => false}.foreach{
  case Some(v) => println(v)
}