Scheme どう書く?的をScalaで書いてみた

Scheme どう書く?的 - higepon blogより

整列済みの number のリストがある。

'(1 3 4 5 6 12 13 15)

このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。

最初の例のリストであれば以下のようになる。

'(1 (3 . 6) (12 . 13) 15)

このようなリストの変換をするコードを書きたい。

ソース

  case class R(s: Int,e: Int)
  case class N(n: Int) extends R(n,n)

  def f( input: List[R] ): List[R] = input match {
    case R(c1,c2)::N(c3)::cdr if(c2+1==c3) => f(R(c1,c3)::cdr)
    case car::cdr => car::f(cdr)
    case r => r
  }
  
  println(f((1::3::4::5::6::12::13::15::Nil)map(N(_))))

実行結果

List(N(1), R(3,6), R(12,13), N(15))

クラスと関数型の出会いに万歳!