kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

irof式が実装できたよ。そう、Scalaならね! (Re: irof文が実装できたよ。そう、Scalaならね!)

See: irof文が実装できたよ。そう、Scalaならね!

返り値が思い通りにならないことに困ってらっしゃったようなので(?)、実装してみました。

object Main {
  case class irof[A](val condition: Boolean)(blockA: => A) {
    val thunk: () => A = () => blockA
    def elof[B <: A](blockB: => B): A = if(condition) thunk() else blockB
  }

  implicit def irofToA[A](i: irof[A]): Any = if(i.condition) i.thunk()

  def main(args: Array[String]) {
    val x: String = irof(args.length > 0) {
      "foo"
    } elof {
      "bar"
    }
    println(x)
  }
}

これの問題点は、elofの型制約のせいで、

val x: Any = irof(args.length > 0) {
  "foo"
} elof {
  1
}
 println(x)

などが通らない事ですが、たぶん解決するのが難しい…(頑張れば解決できるかも)