Scala で階乗
非負整数 n に対して n の階乗を出力するプログラムはいわゆる「再帰呼び出し」の教材として良く用いられるが、言語によっては再帰を使わなくても書けることがある。
で、関数型の要素を持つ Scala で上手いこと書けないか、とまず試作したのがこれ。
def fact(n: Int): Int = { return (1 to n).foldLeft(1){ (a, b) => a * b } }
しかし Scala 2.10 の新機能である implicit class と、foldLeft
の省略記法を組み合わせると
object Fact { implicit class RichInt(val n: Int) { def fact: Int = (1 /: (1 to n)){ _ * _ } } def main(args: Array[String]): Unit = { ... } }
ここまで行けんじゃね ? ってなって、これをはてなダイアリーに乗っけてたんだけど、コメントをもらってこう書けることがわかった。product
っちゅー、そのものずばりなメソッドがあったのだな。
ここで一番の肝なのが、メソッド名の !
と型との間を区切る :
の前に一つスペースを入れること。これをやることによって !
をメソッド名として使えるので 3.!
のように階乗っぽく書けるというわけ。
使うときは
import Fact._ object Hoge { def main(args : Array[String]) : Unit = { println(3.!) // => 6 println(0.!) // => 1 } }
のように使う。
参考サイト : Scala の List クラスで map, filter, foldRight と シーケンス内包表記 | すぐに忘れる脳みそのためのメモ