úÎ[¦     None2346!The class relation between types a and b s.t. a can be injected into b. &The following laws must be fulfilled:   Injectivity x /= y ==> (to x) /= (to y) TotalitytoO should be a total function. No cheating by it undefined for parts of the set! Converts a value of type a "losslessly" to one of type b.    None246ÿÒThe class of isomorphic types, i.e. those which can be cast to each other withouth loss of information. Type isomorphism is an equivalence relation (reflexive, symmetric, transitive), but due to the limitations of the type system, only reflexivity is implemented for all types. Since there are no type inequality constraints, writing symmetry and transitivity instances over all types would result in overlapping instances with due to reflexivity. The following must be ensured:   Isomorphism isoFrom . isoTo = id  8Reflexivity, symmetry and transitivity are then "free":  8instance Iso a a where isoTo = id isoFrom = id  Kinstance Iso a b => Iso b a where isoTo = isoFrom isoFrom = isoTo  einstance (Iso a b, Iso b c) => Iso a c where isoTo = isoTo . isoTo isFrom = isoFrom . isoFrom ÎOut of these, only the first one (reflexivity) is actually implemented, since the other two would result in overlapping instances. We would be able to avoid this with type inequality constrains (e.g. a /~ b, a /~ c, b /~ c).  Synonym for .    !      !"#$type-iso-0.1.0.0Data.Types.InjectiveData.Types.Isomorphic Injectiveto$fInjectiveWholeRatio$fInjectiveIntegerRatio$fInjectiveNatRatio$fInjectiveNatWhole$fInjectiveNatInteger$fInjectiveNaturalRatio$fInjectiveNaturalWhole$fInjectiveNaturalInteger$fInjectiveMaybeEither$fInjectiveNatNatural$fInjectiveNaturalNat$fInjectiveIntegerWhole$fInjectiveWholeInteger$fInjective[]Text$fInjectiveText[]$fInjectiveTextText$fInjectiveTextText0$fInjective[]Text0$fInjectiveText[]0 $fInjectiveaaIsofrom$fIsoIntegerWhole$fIsoWholeInteger $fIsoTextText$fIsoTextText0 $fIso[]Text $fIsoText[] $fIso[]Text0 $fIsoText[]0$fIsoaa