úÎ2¨.Þ-      !"#$%&'()*+,portable provisionalEdward Kmett <ekmett@gmail.com>A - sans .. Minimal definition: Either  or  OIf defining both, then the following laws (the default definitions) must hold:   join = (>>- id)  m >>- f = join (fmap f m) Laws:  4 induced definition of <.>: f <.> x = f >>- (<$> x) 1Finally, there are two associativity conditions:  G associativity of (>>-): (m >>- f) >>- g == m >>- (\x -> f x >>- g) ; associativity of join: join . join = join . fmap join ?These can both be seen as special cases of the constraint that ; associativity of (->-): (f ->- g) ->- h = f ->- (g ->- h) 8Transform a Apply into an Applicative by adding a unit.  Wrap an / to be used as a member of   )A strong lax semi-monoidal endofunctor.  This is equivalent to an / without 0. Laws: B associative composition: (.) <$> u <.> v <.> w = u <.> (v <.> w) a .> b = const id  $ a  . b a  . b = const <$ a  . b TODO: move into Data.Functor  A variant of  with the arguments reversed. 3Lift a binary function into a comonad with zipping 4Lift a ternary function into a comonad with zipping 1An 2 is a /, but it is an instance of  3A 4 is not a -, but it is an instance of  5An IntMap is not /, but it is an instance of   6 A Map is not /, but it is an instance of          portable provisionalEdward Kmett <ekmett@gmail.com>    portable provisionalEdward Kmett <ekmett@gmail.com> 789 EUsable default for foldMap, but only if you define foldMap1 yourself    portable provisionalEdward Kmett <ekmett@gmail.com>!"#$!"#$!"#$!"#"#$portable provisionalEdward Kmett <ekmett@gmail.com>%GA strong lax symmetric semi-monoidal comonad. As such, an instance of % is required to satisfy:  + extract (a <.> b) = extract a $ extract b 'This class is based on ComonadZip from "#The Essence of Dataflow Programming" Mby Tarmo Uustalu and Varmo Vene, but adapted to fit the programming style of Control.Applicative. /. can be seen as a similar law over and above  Apply that: " pure (a $ b) = pure a <.> pure b &3Lift a binary function into a comonad with zipping '4Lift a ternary function into a comonad with zipping :A sad little orphan ;>Both required because Semigroup is not a superclass of Monoid #<=>?@ABCDEFGHI %&'%&'%&'portable provisionalEdward Kmett <ekmett@gmail.com>(Laws: C <!> is associative: (a <!> b) <!> c = a <!> (b <!> c) K <.> right-distributes over <!>: (a <!> b) <.> c = (a <.> c) <!> (b <.> c) K <$> left-distributes over <!>: f <$> (a <!> b) = (f <$> a) <!> (f <$> b) ) ()()())portable provisionalEdward Kmett <ekmett@gmail.com>*+, ()*+,*+,*+,+,J      !"#$%&'()*+,-./0123456 7 89:9;<=>?@=ABCDEEFGHIJKIJLIJMIJNIJOIJPIJPIQRIQSIQTIQUIQVIQWIQXYfunctor-apply-0.9.1Data.Functor.BindData.Semigroup.FoldableData.Semigroup.TraversableControl.Comonad.ApplyData.Functor.AltControl.Applicative.AltData.Functor.ApplybaseGHC.BaseFunctor Data.Functor<$><$fmapBind>>-join MaybeApply runMaybeApplyWrappedApplicativeWrapApplicativeunwrapApplicativeApply<.>.><.$><..>liftF2liftF3 returning-<<->--<- apDefault Foldable1fold1foldMap1 traverse1_for1_ sequenceA1_foldMapDefault1 Traversable1 traverse1 sequence1foldMap1Default ComonadApplyliftW2liftW3AltApplicativeAltsomemanyMonadreturnControl.Applicative Applicativepure $fBindIntMapcontainers-0.4.0.0 Data.IntMapIntMap $fBindMapData.MapMap $fApplyIntMap $fApplyMapActgetAct$fArrowLoopCokleisli$fComonadApply(,)comonad-0.9.0.1Control.ComonadwfixliftWextractComonad runCokleisli CokleisliData.Functor.Extend=>==<=<<==>>extend duplicateExtend