読者です 読者をやめる 読者になる 読者になる

Pychef's Diary

I consider myself an engineer, aren't I?

@annotation.tailrec

"Functional Programming in Scala"を読み始めて、知らない概念ばかりでフルボッコにされている。

Scalaには、便利な@annotationがあることを学ぶ。
@を使うところとかObjective-Cコンパイラディレクティブと同じ。

例えば、関数がTail Recursiveにコーディングされているかを事前に確認したい場合、"@annotation.tailrec"を追記する。
スタックオーバーフローを発生させかねない劣悪なコードをコンパイルエラーで返してくれる。
ちなみに、IntelliJ IDEA 14ではわざわざPlayを押さなくても、エラーを赤ペンを入れてくれて便利。

  def factorial(n: Int): Int = {
    @annotation.tailrec
    def loop(n: Int, acc: Int): Int = {
      if(n<=0) acc
      else loop(n-1, n*acc)
    }
    loop(n,1)
  }