インクリメントパターン?

デザインパターンのパターンではなくパターンマッチのパターン。
Haskellにはn + kパターンという、漸化式を書きやすくする構文があるのだが
Scalaで試みる。
その前にインクリメント。

val ++(n) = 100

で、インクリメントすると100になる数が定数nに代入されるようにできた。
実装は1を引いているだけ。
実は過去のエントリー
http://d.hatena.ne.jp/kya-zinc/20090711/1259845278
のSuccと同じことをやっている。進歩がない。
肝心のn + kパターンの方は、パターンの中で式が評価できないので失敗。
2行に分けて、パターンマッチ用オブジェクトに識別子`10 + ?`をつけてみたら
n + kパターンに見えなくもないものになった。あ、シンタックスハイライトが怪しい。
気持ちとしては、10に何を足したら100になるでしょう?、という雰囲気。

mobject IncrTest {
  def main(Args : Array[String]) : Unit = {
    val ++(n) = 100
    val `10 + ?` = ?+(10)
    val `10 + ?`(n2) = 100

    println(n)
    println(n2)
    println(`10 + ?`)
    
    //does not compile
    //val +?(10)(n3) = 100
  }
}

object ++ {
  def unapply(n : Int) : Option[Int] = Some(n - 1)
}

case class ?+(n : Int) {
  def unapply(m : Int) : Option[Int] = Some(m - n)
}

実行結果

99
90
?+(10)