Guest User

Untitled

a guest
Oct 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.13 KB | None | 0 0
  1. import language.higherKinds
  2. import language.implicitConversions
  3.  
  4. sealed trait Nat {
  5. type +[N <: Nat] <: Nat
  6. def +[N <: Nat](n: N): +[N]
  7. }
  8.  
  9. sealed trait _0 extends Nat {
  10. type +[N <: Nat] = N
  11. def +[N <: Nat](n: N) = n
  12. }
  13.  
  14. case object _0 extends _0
  15.  
  16. case class S[N <: Nat](n: N) extends Nat {
  17. type +[M <: Nat] = S[N# + [M]]
  18. def +[M <: Nat](m: M) = S(n + m)
  19. }
  20.  
  21. trait Monoid[M] extends MonoidLow[M] {
  22. type Zero <: M
  23. type Append[A <: M, B <: M] <: M
  24. def zero: Zero
  25. def append[A <: M, B <: M](a1: A, a2: B): Append[A, B]
  26. }
  27.  
  28. trait MonoidLow[M] { self: Monoid[M] =>
  29. def leftIdentity[A <: M](a: Append[Zero, A]): A
  30. def rightIdentity[A <: M](a: Append[A, Zero]): A
  31. def associativity[A <: M, B <: M, C <: M](a: Append[A, Append[B, C]]): Append[Append[A, B], C]
  32. }
  33.  
  34. object NatInstance extends Monoid[Nat] {
  35. type Zero = _0
  36. type Append[A <: Nat, B <: Nat] = A# + [B]
  37. def zero = _0
  38. def append[A <: Nat, B <: Nat](a: A, b: B) = a + b
  39. def leftIdentity[A <: Nat](a: Append[Zero, A]) = a
  40. implicit def rightIdentity[A <: Nat](a: Append[A, Zero]) = a
  41. implicit def associativity[A <: Nat, B <: Nat, C <: Nat](a: Append[A, Append[B, C]]) = a
  42. }
Add Comment
Please, Sign In to add comment