úÎ0N.ô     None *,9:;DORTkA very generic class for a map function on heterogeneous data structures (i.e. those with differing types)."This allows you to do things like:$hmap triple (3 :: Int, 4.5 :: Float)(9 :: Int, 13.5 :: Float) takes as it's function a 1, as of course you'd want a polymorphic function.EThe return type defined in the class is very vague, indeed it's just t: to be detailed in the instances, because unlike a normal  function, how O changes the type depends a lot on the type it's applied to, there's no simple  f a -> f b.\Currently only instances are defined are for 2 and 3 tuples, nag me if you want larger ones.ÀIt's worth noting how the instances are defined, for example, for the 2 tuples, there are 3 instances defined. This is primarily to help type inference. We don't know too much about the types * will produce, but we do know, if we feed ? a pair, we should get a pair back. Likewise, if the result of , is a pair, then the input should be a pair.èSo we provide both instances where the input is a pair, and when the output is a pair. In both of these instances, we then in the constraints section (which happens after instance selection) ensure the other argument is also a pair.ÁThe "know both are pairs already" case just needs to be added as a specific overlapping instance so the compiler has a most specific match when it already knows both input and output are pairs.  None*,9:;<=DOQRT The empty constraint: Empty aalways succeeds. lHandy type class for expressing an "is equal to" constraint, because as a class it can be partially applied.For example, whilst Num is a constraint function from (* -> Constraint) such that (Num t) succeeds only if t is a Num,  Equal Int$ is a constraint function such that  (Equal Int) t succeeds only if t is an Int. For example: 0mkPolyFunc1 @Integral @(Equal Integer) toIntegerIs a polymorphic  function. 3'mkPolyHomoFunc1 simply represents a function from t -> t, possibly constrained.DFor example, this is how to write a polymorphic version of "triple": mkPolyHomoFunc1 @Num (*3) D'mkPolyFunc1 is for one argument functions with differing arguments.;For example, this is how to write a polymorphic version of : 0mkPolyFunc1 @Integral @(Equal Integer) toIntegerNote that something like Just :: t -> Maybe td this convience function is not helpful for, because the two constraints you pass here are separate. 3'mkPolyHomoFunc2 simply represents a function from  t -> t -> t, possibly constrained.AFor example, this is how to write a polymorphic version of "add": mkPolyHomoFunc2 @Num (+)+'mkPolyArgFunc2 represents a function from  t -> t -> rB, with two constraints, one for the arguments, one for the result.@For example, this is how to write a polymorphic version of "eq": )mkPolyHomoArgFunc2 @Eq @(Equal Bool) (==)            !"#polydata-0.2-48WEP77h6cxDuIBVSjK5J3Data.Poly.FunctorData.Poly.Function PolyFunctorhmapPolyFunctorConstraint$fPolyFunctor(->)$fPolyFunctor(->)0$fPolyFunctor(->)1$fPolyFunctor(->)2$fPolyFunctor(->)3$fPolyFunctor(->)4EmptyEqualmkPolyHomoFunc1 mkPolyFunc1mkPolyHomoFunc2mkPolyHomoArgFunc2$fEmptya $fEqualab$fPolyHomoFunc1Constraintscf$fPolyFunc1Constraintsc1c2f,polydata-core-0.1.0.0-F5SS2F1X5mmCkyNtf4tap5 Data.PolyPolybaseGHC.Basemap hmapTuple2 hmapTuple3GHC.Real toIntegerPolyHomoFunc1ConstraintsPolyFunc1Constraints