We can lift subtyping into any invariant or covariant type constructor
We can lift subtyping into any contravariant type constructor
Unsafely force a claim that A is a subtype of B
Lift Scala's subtyping relationship
lift2(a,b) = co1_2(a) compose co2_2(b)
lift3(a,b,c) = co1_3(a) compose co2_3(b) compose co3_3(c)
lift4(a,b,c,d) = co1_3(a) compose co2_3(b) compose co3_3(c) compose co4_4(d)
Lift subtyping into a Function1-like type liftF1(a,r) = contra1_2(a) compose co2_2(b)
Lift subtyping into a function liftF2(a,b,r) = contra1_3(a) compose contra2_3(b) compose co3_3(c)
Lift subtyping into a function liftF3(a,b,c,r) = contra1_4(a) compose contra2_4(b) compose contra3_4(c) compose co3_4(d)
Lift subtyping into a function
Subtyping is reflexive
Subtyping is transitive
We can witness equality by using it to convert between types