Îõ³h*(1      !"#$%&'()*+,-./00.2 Safe-Inferredÿ matchableÃContainers that allows exact structural matching of two containers. Bimatchable is 1 -version of  Matchable;. It can compare and zip containers with two parameters. matchable is to  what 2 is to 3.ÖDecides if two structures match exactly. If they match, return zipped version of them.LawForall  x :: t a b,  y :: t a' b', z :: t (a,a') (b,b'), bizipMatch x y = Just zholds if and only if both of 'x = bimap fst fst z y = bimap snd snd zholds. Otherwise, bizipMatch x y = Nothing.ExamplebizipMatch (Left 1) (Left 'a')Just (Left (1,'a'))"bizipMatch (Right 1) (Right False)Just (Right (1,False))!bizipMatch (Left 1) (Right False)Nothing matchable is to  what 2 is to 3.ÅMatch two structures. If they match, zip them with given functions (a -> a' -> Maybe a'') and (b -> b -> Maybe b'');. Passed functions can make whole match failby returning Nothing.LawFor any Ëx :: t a b y :: t a' b' f :: a -> a' -> Maybe a'' g :: b -> b' -> Maybe b'' must satisfy the following.If there is a pair &(z :: t (a,a') (b,b'), w :: t a'' b'')Ð such that fulfills all of the following three conditions, then bizipMatchWith f g x y = Just w.  x = bimap fst fst z y = bimap snd snd z 3bimap (uncurry f) (uncurry g) z = bimap Just Just wIf there are no such pair,  bizipMatchWith f g x y = Nothing. Safe-Inferred 9ÃÍÚÛë  matchableÃContainers that allows exact structural matching of two containers.  matchableÖDecides if two structures match exactly. If they match, return zipped version of them. zipMatch ta tb = Just tabholds if and only if both of #ta = fmap fst tab tb = fmap snd tabholds. Otherwise, zipMatch ta tb = Nothing.#For example, the type signature of zipMatch on the list Functor [] reads as follows: 'zipMatch :: [a] -> [b] -> Maybe [(a,b)]zipMatch as bs returns Just (zip as bs); if the lengths of two given lists are same, and returns Nothing otherwise.Example"zipMatch [1, 2, 3] ['a', 'b', 'c']Just [(1,'a'),(2,'b'),(3,'c')]zipMatch [1, 2, 3] ['a', 'b']Nothing  matchableÄMatch two structures. If they match, zip them with given function (a -> b -> Maybe c);. Passed function can make whole match fail by returning Nothing.A definition of   must satisfy:If there is a pair  (tab, tc)Á such that fulfills all following three conditions, then zipMatchWith f ta tb = Just tc.  ta = fmap fst tab tb = fmap snd tab #fmap (uncurry f) tab = fmap Just tcIf there are no such pair, zipMatchWith f ta tb = Nothing.If t is also 4Ó, the last condition can be dropped and the equation can be stated without using tc. /zipMatchWith f ta tb = traverse (uncurry f) tabzipMatch can be defined in terms of  zipMatchWith . And if t is also  Traversable,  zipMatchWith can be defined in terms of zipMatchì. When you implement both of them by hand, keep their relation in the way the default implementation is. ïzipMatch = zipMatchWith (curry pure) zipMatchWith f ta tb = zipMatch ta tb >>= traverse (uncurry f) matchable #zipzipMatch = zipMatchWith zipMatch matchable Matchable t implies  Functor t(. It is not recommended to implement fmap* through this function, so it is named  fmapRecovered but not  fmapDefault. matchable Matchable t implies Eq a => Eq (t a). matchable Matchable t implies Eq1 t. matchablezipMatchWith via Generics.    5      !"#$%&'()*+,-./0123456756859:5;<=$matchable-0.2-2guFxNGXHgjCskIHzE0xslData.BimatchableData.Matchable matchablezipMatch zipMatchWith Bimatchable bizipMatchbizipMatchWithbimapRecovered eq2DefaultliftEq2Default$fBimatchableTagged$fBimatchableConst$fBimatchable(,)$fBimatchableEither Matchable' Matchable zipzipMatch fmapRecovered eqDefault liftEqDefaultgenericZipMatchWith$fMatchableHashMap$fMatchableVector$fMatchableTree$fMatchableIntMap$fMatchableMap$fMatchableSeq$fMatchableEither$fMatchable(,)$fMatchableNonEmpty$fMatchableList$fMatchableMaybe$fMatchableTagged$fMatchableProxy$fMatchableCompose$fMatchableSum$fMatchableProduct$fMatchableConst$fMatchableIdentity$fMatchable':.:$fMatchable':*:$fMatchable':+:$fMatchable'M1$fMatchable'K1$fMatchable'Rec1$fMatchable'Par1$fMatchable'U1$fMatchable'V1$fMatchableGenerically1$fApplicativeFillIn$fFunctorFillInbaseData.Bifunctor BifunctorbimapGHC.BasefmapData.Traversable Traversable