似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

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 っちゅー、そのものずばりなメソッドがあったのだな。


Factorial with Scala

ここで一番の肝なのが、メソッド名の ! と型との間を区切る : の前に一つスペースを入れること。これをやることによって !メソッド名として使えるので 3.! のように階乗っぽく書けるというわけ。

使うときは

import Fact._

object Hoge {
  def main(args : Array[String]) : Unit = {
    println(3.!) // => 6
    println(0.!) // => 1
  }
}

のように使う。

参考サイト : Scala の List クラスで map, filter, foldRight と シーケンス内包表記 | すぐに忘れる脳みそのためのメモ