sonoshouのまじめなブログ

情報系大学生からのウェブ見習い人生の記録

foreach, map, filter,match

関数型言語で頻出の処理、

  • foreach
  • map
  • filter

についてまとめます。
言語はScalaです。
(お友達からの受け売り。)

今回はコレクションにArrayを用いましたが、
Listでも同様のことが可能です。

foreach

Array(1,2,3,4,5).foreach {(v:Int) => print(v)}
//12345   <- output

foreachは、リストから1つずつ引数を受け取り、処理する場合に用います。
また、引数を表す_(アンダースコア)を用いると以下のように書き換えられます。

Array(1,2,3,4,5).foreach {print(_)}
//12345   <- output

もちろん、手続き型風に書くことも出来、その場合は、

val array = Array(1,2,3,4,5)
for (i <- array) print(i)
//12345   <- output

となります。

map

Array(1,2,3,4,5).map {(v:Int) => v*2}
//Array[Int] = Array(2, 4, 6, 8, 10)    <- output

mapは、リストの各要素に対して、何らかの処理を行ってリストを返す時に使います。

また、引数を表す_(アンダースコア)を用いると以下のように書き換えられます。

Array(1,2,3,4,5).map {_*2}
//Array[Int] = Array(2, 4, 6, 8, 10)    <- output

手続き型風に書くことも出来、その場合は、for yield文を使います。
(これを手続き言語風と呼んでよいのか疑問ですが。)

val array = Array(1,2,3,4,5)
for (i <- array) yield i * 2
//Array[Int] = Array(2, 4, 6, 8, 10)    <- output

となります。

filter

Array(1,2,3,4,5).filter {(v:Int) => v%2 == 0}
//Array[Int] = Array(2, 4)    <- output

filterは、条件に合致したリストを返す時に使います。

また、引数を表す_(アンダースコア)を用いると以下のように書き換えられます。

Array(1,2,3,4,5).filter {_%2==0}
//Array[Int] = Array(2, 4)    <- output

手続き型風に書くことも出来、その場合は、for yield文を使います。
(これを手続き言語風と呼んでよいのか疑問ですが。)

val array = Array(1,2,3,4,5)
for (i <- array if i%2 == 0) yield i
//Array[Int] = Array(2, 4)    <- output

となります。

mapの使い方


2012年6月17日更新

fizzbuzz問題をmapを使って解くとこうなります。
mapとcaseは基本の操作なので、覚えましょう!

val N = readLine(); 
List.range(1,N.toInt+1).map {
  case n if (n%15 == 0) => "fizzbuzz"
  case n if (n%3 == 0) => "fizz"
  case n if (n%5 == 0) => "buzz"
  case n => n
}.foreach{println(_)}

matchの使い方


2012年10月18日更新

パターンマッチの例です。
mapはリストに適用しますが、
値の場合はmatchを使います。
温度を入力として受け取り、iceかwatorかvaporを返す関数の例です。

val input = readLine().toInt match {
  case v if(v<0) => println("ice")
  case v if(v>100) => println("vapor")
  case v => println("water")
}