Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save janekdb/5ea4adde1633d0f9b6d4e7e7bdfb93c5 to your computer and use it in GitHub Desktop.
Save janekdb/5ea4adde1633d0f9b6d4e7e7bdfb93c5 to your computer and use it in GitHub Desktop.
Scala Type Level Programming: The Natural Numbers: Exponentiation
sealed trait Nat {
type exp[That <: Nat] <: Nat
type expflip[That <: Nat] <: Nat
}
sealed trait MsbZero extends Nat {
override type exp[That <: Nat] = MsbZero
override type expflip[That <: Nat] = MsbOne
}
sealed trait MsbOne extends Nat {
override type exp[That <: Nat] = MsbOne
override type expflip[That <: Nat] = That
}
sealed trait B0[HigherBits <: Nat] extends Nat {
override type exp[That <: Nat] = That#expflip[B0[HigherBits]]
override type expflip[That <: Nat] = HigherBits#expflip[That#mult[That]]
}
sealed trait B1[HigherBits <: Nat] extends Nat {
override type exp[That <: Nat] = That#expflip[B1[HigherBits]]
override type expflip[That <: Nat] = HigherBits#expflip[That#mult[That]]#mult[That]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment