■
"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 させればいいのかな?