Scala Advent Calendar jp 2011の記事です。12/07に割り振られていたことに気づいていませんでしたorz。申し訳ありません。 さて、ネタを後で考えるつもりだったので迷ったのですが、直近で面白かったネタということでパーザコンビネータのちょっと変わった 使い方について紹介したいと思います。
さて、いきなり話が飛びますが、皆様はRubyのヒアドキュメントについてご存知でしょうか?
puts <
/* | |
* http://projecteuler.net/problem=2 | |
* http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 | |
*/ | |
val fib: List[Int] => List[Int] = { | |
case Nil | _ :: Nil => throw new IllegalArgumentException | |
case xs @ (a :: b :: tail) => { | |
val nextNum = a + b | |
if (nextNum >= 4000000) { | |
xs |
// コンストラクタをプライベートにし、コンパニオンオブジェクト経由でのみ生成させる。 | |
class ClassName[A] private (val clazz: Class[A]) { | |
// toString で、引数に指定されたクラスの名称を返す。 | |
override def toString(): String = { | |
clazz.getName | |
} | |
} | |
object ClassName { | |
// Classを直接渡して生成する。 |
object RetryUtil { | |
case class RetryException(throwables: List[Throwable]) extends Exception | |
def retry[T](retryLimit: Int, retryInterval: Int, shouldCatch: Throwable => Boolean)(f: => T): T = { | |
// @annotation.tailrec | |
def _retry( errors: List[Throwable], f: => T):T = { | |
try { | |
f | |
} catch { |
// Inversefizzbuzz | |
// http://www.jasq.org/2/post/2012/05/inverse-fizzbuzz.html | |
// | |
// fork from https://gist.github.com/2699068 | |
object InverseFizzbuzz extends App { | |
def zzubzzif(pattern:Seq[String]) = { | |
def fizzbuzz(n:Int) = (n%3, n%5) match{ | |
case (0,0) => "fizzbuzz" | |
case (0,_) => "fizz" |