Skip to content

Instantly share code, notes, and snippets.

@janekdb
janekdb / type-level-programming-natural-numbers-exponentiation-assertions.scala
Created June 6, 2017 21:14
Scala Type Level Programming: The Natural Numbers: Exponentiation Assertions
// 1^0
implicitly[T1#exp[T0] =:= T1]
// 1^1
implicitly[T1#exp[T1] =:= T1]
// 1^2
implicitly[T1#exp[T2] =:= T1]
// 1^3
implicitly[T1#exp[T3] =:= T1]
// 2^0
@janekdb
janekdb / type-level-programming-natural-numbers-exponentiation.scala
Last active June 11, 2017 20:49
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
}
@janekdb
janekdb / type-level-programming-natural-numbers-addition-assertions.scala
Last active June 11, 2017 20:54
Scala Type Level Programming: The Natural Numbers: Addition Assertions
// 0 + 0, 0 + 1
implicitly[MsbZero#add[MsbZero] =:= MsbZero]
implicitly[MsbZero#add[MsbOne] =:= MsbOne]
// 1 + 0, 1 + 1
implicitly[MsbOne#add[MsbZero] =:= MsbOne]
implicitly[MsbOne#add[MsbOne] =:= B0[MsbOne]]
// 2 + 0, 2 + 1, 2 + 2
implicitly[B0[MsbOne]#add[MsbZero] =:= B0[MsbOne]]
@janekdb
janekdb / type-level-programming-natural-numbers-addition.scala
Last active April 26, 2018 14:58
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
@janekdb
janekdb / type-level-programming-natural-numbers-high-hex.scala
Created May 25, 2017 08:40
Scala Type Level Programming: The Natural Numbers: High Hex
sealed trait Nat {
type inc <: Nat
type dbl <: Nat
type A = this.type#dbl#inc#dbl#dbl#inc#dbl
type B = this.type#dbl#inc#dbl#dbl#inc#dbl#inc
type C = this.type#dbl#inc#dbl#inc#dbl#dbl
type D = this.type#dbl#inc#dbl#inc#dbl#dbl#inc
type E = this.type#dbl#inc#dbl#inc#dbl#inc#dbl
type F = this.type#dbl#inc#dbl#inc#dbl#inc#dbl#inc
@janekdb
janekdb / type-level-programming-natural-numbers-first-assertions.scala
Last active June 11, 2017 20:59
Scala Type Level Programming: The Natural Numbers: First Assertions
// 1 = O + 1
implicitly[MsbOne =:= MsbZero#inc]
// 2 = O + 1 + 1
implicitly[B0[MsbOne] =:= MsbZero#inc#inc]
// 3 = O + 1 + 1 + 1
implicitly[B1[MsbOne] =:= MsbZero#inc#inc#inc]
// 4 = O + 1 + 1 + 1 +
@janekdb
janekdb / type-level-programming-natural-numbers-first-definitions.scala
Last active June 11, 2017 21:02
Scala Type Level Programming: The Natural Numbers: First Definitions
sealed trait Nat {
type inc <: Nat
type dbl <: Nat
}
sealed trait MsbZero extends Nat {
override type inc = MsbOne
override type dbl = MsbZero
}
@janekdb
janekdb / type-level-programming-natural-numbers-mult-example.scala
Created May 23, 2017 10:31
Scala Type Level Programming: The Natural Numbers: Multiplication Example
// 2 x 3 5 x 7 x 11 x 13 x 17 = 510510
type T510 = T5#mult[T10]#add[T1]#mult[T10]
type T510510 = T510#mult[T1000]#add[T510]
implicitly[T2#mult[T3]#mult[T5]#mult[T7]#mult[T11]#mult[T13]#mult[T17] =:= T510510]
@janekdb
janekdb / type-level-programming-natural-numbers-mult-assert.scala
Last active June 11, 2017 21:07
Scala Type Level Programming: The Natural Numbers: Multiplication Assertions
implicitly[MsbZero#mult[MsbZero] =:= MsbZero]
implicitly[MsbZero#mult[MsbOne] =:= MsbZero]
implicitly[MsbOne#mult[MsbZero] =:= MsbZero]
implicitly[MsbOne#mult[MsbOne] =:= MsbOne]
implicitly[T0#mult[T0] =:= T0]
implicitly[T0#mult[T2] =:= T0]
implicitly[T0#mult[T4] =:= T0]
implicitly[T1#mult[T0] =:= T0]
@janekdb
janekdb / type-level-programming-natural-numbers-mult.scala
Last active June 11, 2017 20:50
Scala Type Level Programming: The Natural Numbers: Multiplication
sealed trait Nat {
type mult[That <: Nat] <: Nat
}
sealed trait MsbZero extends Nat {
override type mult[That <: Nat] = MsbZero
}
sealed trait MsbOne extends Nat {
override type mult[That <: Nat] = That