úÎ#Ð 2      !"#$%&'()*+,-./01(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 \Type constructors are injective, so you can lower equality through any type constructor ... ... in any position ...8... these definitions are poly-kinded on GHC 7.6 and up.Equality forms a category   23456789:;<=>?@ABCDEFGHI4+(C) 2011-2014 Edward Kmett, 2018 Ryan Scott BSD-style (see the file LICENSE)Edward Kmett <ekmett@gmail.com> provisionalGHCNone &',-FGQSTV² "Heterogeneous Leibnizian equality.nLeibnizian equality states that two things are equal if you can substitute one for the other in all contexts.Equality is reflexive.:If two things are equal, you can convert one to the other.JEquality is compositional.Equality is transitive.Equality is symmetric.2You can lift equality into any type constructor...... in any position.#XType constructors are injective, so you can lower equality through any type constructor.&tConvert an appropriately kinded heterogeneous Leibnizian equality into a homogeneous Leibnizian equality '(ET.:=)'.'qConvert a homogeneous Leibnizian equality '(ET.:=)' to an appropriately kinded heterogeneous Leibizian equality.1Equality forms a category. !"#$%&'()*+, !"#$%&'()*+, KLMNOPQRSTUVWXYZ[\]^_`abcdefgh4i           !"#$%&&'(()**+,,-../0012234456778&&'(()**+,,-../00122399:445;eq-4.2-D5CoXDwbNONJK1W17PsDYX Data.Eq.TypeData.Eq.Type.Hetero:=Reflsubstreflcoercetranssymmliftlift2lift2'lift3lift3'lowerlower2lower3 fromLeibniz toLeibniz reprLeibniz$fTestCoercionk:=$fTestEqualityk:= $fGroupoidk:=$fSemigroupoidk:= $fCategoryk:=:==HReflhsubst toHomogeneousfromHomogeneousheteroFromLeibnizheteroToLeibniz$fTestCoercionk:==$fTestEqualityk:==$fGroupoidk:==$fSemigroupoidk:==$fCategoryk:==Lower3unlower3Lower2unlower2LowerunlowerLift3unlift3Lift2unlift2LiftunliftSymmunsymmCoerceuncoercecompFlayunflayPushunpush