// https://en.wikibooks.org/wiki/Haskell/Continuation_passing_style#Passing_continuations def add(x: Int, y:Int): Int = x + y def addCps[R](x: Int, y: Int): ((Int => R) => R) = { def lambda[K]: (Int => K) => K = {k: (Int => K) => k(add(x, y))} lambda } def square(x: Int): Int = x * x def squareCps[R](x: Int): ((Int => R) => R) = { def lambda[K]: (Int => K) => K = { k: (Int => K) => k(square(x)) } lambda } def pythagoras(x: Int, y: Int): Int = add(square(x), square(y)) def pythagorasCps[R](x: Int, y: Int): ((Int => R) => R) = { def lambda[K]: (Int => K) => K = {k: (Int => K) => val `x^2`: (Int => K) => K = squareCps[K](x) val `y^2`: (Int => K) => K = squareCps[K](y) `x^2`{xSquared => `y^2`{ySquared => addCps[K](xSquared, ySquared)(k) } } } lambda } val sCps: (Int => Unit) => Unit = squareCps[Unit](2) sCps({a => println(a)}) val aCps: (Int => Unit) => Unit = addCps[Unit](1, 2) aCps({a => val b = a*13 println(b) }) val pCsp: (Int => Unit) => Unit = pythagorasCps[Unit](3, 4) pCsp(println) // https://scastie.scala-lang.org/Yaneeve/PIcmIoO6SJyJREjNezp8qg