Skip to content

Instantly share code, notes, and snippets.

@Yaneeve
Last active December 14, 2018 17:39
Show Gist options
  • Save Yaneeve/8f105ac988f3d4a88f73b3eab54272cd to your computer and use it in GitHub Desktop.
Save Yaneeve/8f105ac988f3d4a88f73b3eab54272cd to your computer and use it in GitHub Desktop.
Continuation Passing Style - example converted to scala from haskell; this time without the $ op
//https://en.wikibooks.org/wiki/Haskell/Continuation_passing_style#Passing_continuations
val add: Int => Int => Int = {x => { y => x + y}}
//add(1)(2)
//Function.uncurried(add)(1, 2)
def addCps[R]: Int => Int => ((Int => R) => R) = {x => { y =>
def lambda[K]: (Int => K) => K = {k: (Int => K) => k(add(x)(y))}
lambda
}}
val square: Int => Int = { x => x * x }
//square(2)
def squareCps[R]: Int => ((Int => R) => R) = { x =>
def lambda[K]: (Int => K) => K = { k: (Int => K) => k(square(x)) }
lambda
}
val pythagoras: Int => Int => Int = {x => {y => add(square(x))(square(y))}}
//pythagoras(2)(3)
//Function.uncurried(pythagoras)(2, 3)
def pythagorasCps[R]: Int => Int => ((Int => R) => R) = {x => {y =>
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/BVYFqjG0SsG4kDcdx7i5uQ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment