// === // 継続ってどこだっけ? def add[R](i: Int, j: Int)(cont: Int => R): R = { val a = i + j cont(a) } def show[R](i: Int)(cont: String => R): R = { val a = "num: " + i.toString cont(a) } // === // メソッド定義を再掲 def add[R](i: Int, j: Int)(cont: Int => R): R = { ??? } def show[R](i: Int) (cont: String => R): R = { ??? } // 継続部分を関数に変更 def add[R](i: Int, j: Int): (Int => R) => R = { cont => ??? } def show[R](i: Int) : (String => R) => R = { cont => ??? } // (A => R) => R という関数に Cont[R, A] と名前をつける type Cont[R, A] = (A => R) => R def add[R](i: Int, j: Int): Cont[R, Int] = { cont => ??? } def show[R](i: Int) : Cont[R, String] = { cont => ??? } // === // Scala ではしばしばラップするデータ型を定義 final case class Cont[R, A](run: (A => R) => R) // もちろん、データ型 Cont[R, A] を用いて add, show が定義できる def add[R](i: Int, j: Int): Cont[R, Int] = Cont { cont => ??? } def show[R](i: Int) : Cont[R, String] = Cont { cont => ??? }