úÎ:       (C) 2011-2014 Edward Kmett BSD-style (see the file LICENSE)Edward Kmett <ekmett@gmail.com> provisional5rank2 types, type operators, (optional) type familiesNone &',FGQSTV ‚ mLeibnizian equality states that two things are equal if you can substitute one for the other in all contextsEquality is reflexive8If two things are equal you can convert one to the otherEquality is transitiveEquality is symmetric/You can lift equality into any type constructor... in any position WType constructors are injective, so you can lower equality through any type constructor ... in any positionQBut unfortunately these definitions aren't polykinded. Everything is just a star.Equality forms a category    !"#$%&'()*+,-.4/      !!"##$%%&''()eq-4.1-9DQpHCUo462CTPEKZ3j83S Data.Eq.Type:=Reflsubstreflcoercetranssymmliftlift2lift2'lift3lift3'lowerlower2lower3 fromLeibniz toLeibniz reprLeibniz$fTestCoercionk:=$fTestEqualityk:= $fGroupoidk:=$fSemigroupoidk:= $fCategoryk:=Lower3unlower3Lower2unlower2LowerunlowerLift3unlift3Lift2unlift2LiftunliftSymmunsymmCoerceuncoerce