Scalaで入門 関数プログラミングその1

WEB+DB PRESS vol.67 の[入門]関数プログラミングScalaでごにょごにょしてみる。

zip

Prelude> zip [0..] [10,20,30,40,50]
[(0,10),(1,20),(2,30),(3,40),(4,50)]

zipの第一引数であるリストには「おわり」が指定されていません。この場合、必要なだけ生成することを意味します。

Scalaでは、Streamを使うとできるみたい。

scala> List( 10,20,30,40,50 ) zip Stream.from(0)
res10: List[(Int, Int)] = List((10,0), (20,1), (30,2), (40,3), (50,4))

reduce - 畳み込み

Prelude> let mul(i,x) = x * i
Prelude> let calc xs = foldl (+) 0 (map mul (zip [0..] xs))
Prelude> calc [10,20,30]
80

Scalaでは、

scala> def calc( xs: List[Int] ): Int = ( 0 /: (( xs zip Stream.from(0)) map (x => x._1 * x._2)))(_ + _)
calc: (xs: List[Int])Int

scala> calc( List(10,20,30) )
res13: Int = 80

と書けるっぽい。長い。