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
と書けるっぽい。長い。