"upTo(1,5) => List(1,2,3,4,5)"みたいな関数 upTo を定義しようとして怒られた。Int と BigInt で使えるようにしたかったんだけど。
これは OK。

object UpTo {
  def upToInt(x:Int,y:Int):List[Int] = {
    def up(n:Int):List[Int] = if (y==n) List(n) else n::up(n+1)
    up(x)
  }
  def upToBig(x:BigInt,y:BigInt):List[BigInt] = {
    def up(n:BigInt):List[BigInt] = if (y==n) List(n) else n::up(n+1)
    up(x)
  }
}

Int にも BigInt にも(+)関数が定義されているから、これらをひとつの関数にできるはず。型パラメータ(っていうのかな?)を使ってみよう。

object UpTo {
  def upToInt(x:Int,y:Int):List[Int] = {
    def up(n:Int):List[Int] = if (y==n) List(n) else n::up(n+1)
    up(x)
  }
  def upToBig(x:BigInt,y:BigInt):List[BigInt] = {
    def up(n:BigInt):List[BigInt] = if (y==n) List(n) else n::up(n+1)
    up(x)
  }

  def upTo[T](x:T,y:T):List[T] = {
    def up(n:T):List[T] = if (y==n) List(n) else n::up(n+1)
    up(x)
  }
}
UpTo.scala:12: error: type mismatch;
 found   : Int(1)
 required: String
    def up(n:T):List[T] = if (y==n) List(n) else n::up(n+1)
                                                         ^
one error found

なぜ String が求められるのかわからんけど。T が一般的すぎるのが原因だろうから T に制限をかけてみようとしたんだけど、Int と BigInt に共通のクラスがなんかよくわからなかった。Duck Typing させればいいのかな?