Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save janekdb/f40d7e60c250b05769ab09d9fd158527 to your computer and use it in GitHub Desktop.
Save janekdb/f40d7e60c250b05769ab09d9fd158527 to your computer and use it in GitHub Desktop.
Scala Type Level Programming: The Natural Numbers: Addition
sealed trait Nat {
type half <: Nat
type add[That <: Nat] <: Nat
// TODO: Better name
type coreT[That <: Nat] <: Nat
}
sealed trait MsbZero extends Nat {
override type half = MsbZero
override type add[That <: Nat] = That
override type coreT[That <: Nat] = B0[That]
}
sealed trait MsbOne extends Nat {
override type half = MsbZero
override type add[That <: Nat] = That#inc
override type coreT[That <: Nat] = B1[That]
}
sealed trait B0[HigherBits <: Nat] extends Nat {
override type half = HigherBits
override type add[That <: Nat] = That#coreT[That#half#add[HigherBits]]
override type coreT[That <: Nat] = B0[That]
}
sealed trait B1[HigherBits <: Nat] extends Nat {
override type half = HigherBits
override type add[That <: Nat] = That#inc#coreT[That#inc#half#add[HigherBits]]
override type coreT[That <: Nat] = B1[That]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment