Skip to content

Instantly share code, notes, and snippets.

@mosesn
Last active August 29, 2015 13:56
Show Gist options
  • Save mosesn/9014629 to your computer and use it in GitHub Desktop.
Save mosesn/9014629 to your computer and use it in GitHub Desktop.
more experiments in doing weird type parameterization stuff
class Mult[A, B](val l: A, val r: B) {
def commute: Mult[B, A] = new Mult[B, A](r, l)
def associate[C, D](implicit ev: B <:< Mult[C, D]): Mult[Mult[A, C], D] =
new Mult[Mult[A, C], D](new Mult(l, r.l), r.r)
def left[C](fn: A => C): Mult[C, B] = new Mult(fn(l), r)
def right[C](fn: B => C): Mult[A, C] = new Mult(l, fn(r))
}
class Div[A, B](val l: A, val r: B) {
def associate[C, D](implicit ev: B <:< Div[C, D]): Div[Mult[A, D], C] = {
new Div[Mult[A, D], C](new Mult(l, r.r), r.l)
}
def left[C](fn: A => C): Div[C, B] = new Div(fn(l), r)
def right[C](fn: B => C): Div[A, C] = new Div(l, fn(r))
}
object TryIt {
class Cat
class Dog
class Mouse
val x: Mult[Cat, Dog] = (new Mult(new Dog, new Cat)).commute
val y: Mult[Mult[Cat, Dog], Mouse] = (new Mult(new Cat, new Mult(new Dog, new Mouse))).associate
val z: Mult[Mouse, Mult[Cat, Dog]] = (new Mult(new Cat, new Mult(new Dog, new Mouse))).associate.commute
val a: Div[Mult[Cat, Mouse], Dog] = new Div(new Cat, new Div(new Dog, new Mouse)).associate
val b: Div[Mult[Mouse, Cat], Dog] = new Div(new Cat, new Div(new Dog, new Mouse)).associate.left(_.commute)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment