kan-extensions 5.0.1 → 5.0.2
raw patch · 7 files changed
+93/−14 lines, 7 filesdep +failPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: fail
API changes (from Hackage documentation)
- Control.Comonad.Density: Density :: (k b -> a) -> k b -> Density k a
- Data.Functor.Contravariant.Coyoneda: Coyoneda :: (a -> b) -> f b -> Coyoneda f a
- Data.Functor.Coyoneda: Coyoneda :: (b -> a) -> f b -> Coyoneda f a
- Data.Functor.Coyoneda: instance (GHC.Base.Functor f, GHC.Read.Read (f a)) => GHC.Read.Read (Data.Functor.Coyoneda.Coyoneda f a)
- Data.Functor.Kan.Lan: Lan :: (g b -> a) -> h b -> Lan g h a
+ Control.Comonad.Density: [Density] :: (k b -> a) -> k b -> Density k a
+ Control.Monad.Co: instance (Control.Comonad.Comonad w, Control.Monad.Fail.MonadFail m) => Control.Monad.Fail.MonadFail (Control.Monad.Co.CoT w m)
+ Control.Monad.Codensity: instance Control.Monad.Fail.MonadFail f => Control.Monad.Fail.MonadFail (Control.Monad.Codensity.Codensity f)
+ Data.Functor.Contravariant.Coyoneda: [Coyoneda] :: (a -> b) -> f b -> Coyoneda f a
+ Data.Functor.Coyoneda: [Coyoneda] :: (b -> a) -> f b -> Coyoneda f a
+ Data.Functor.Coyoneda: hoistCoyoneda :: (forall a. f a -> g a) -> (Coyoneda f b -> Coyoneda g b)
+ Data.Functor.Coyoneda: instance GHC.Read.Read (f a) => GHC.Read.Read (Data.Functor.Coyoneda.Coyoneda f a)
+ Data.Functor.Day: instance (Control.Comonad.Comonad f, Control.Comonad.Comonad g) => Control.Comonad.Comonad (Data.Functor.Day.Day f g)
+ Data.Functor.Day: instance (Control.Comonad.ComonadApply f, Control.Comonad.ComonadApply g) => Control.Comonad.ComonadApply (Data.Functor.Day.Day f g)
+ Data.Functor.Day: instance Control.Comonad.Comonad f => Control.Comonad.Trans.Class.ComonadTrans (Data.Functor.Day.Day f)
+ Data.Functor.Kan.Lan: [Lan] :: (g b -> a) -> h b -> Lan g h a
Files
- .travis.yml +15/−7
- CHANGELOG.markdown +4/−0
- kan-extensions.cabal +2/−1
- src/Control/Monad/Co.hs +4/−0
- src/Control/Monad/Codensity.hs +5/−0
- src/Data/Functor/Coyoneda.hs +44/−5
- src/Data/Functor/Day.hs +19/−1
.travis.yml view
@@ -25,13 +25,22 @@ - env: CABALVER=1.22 GHCVER=7.10.1 compiler: ": #GHC 7.10.1" addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.1,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}- - env: CABALVER=1.22 GHCVER=7.10.2- compiler: ": #GHC 7.10.2"- addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}- - env: CABALVER=1.24 GHCVER=8.0.1- compiler: ": #GHC 8.0.1"- addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}+ - env: CABALVER=1.22 GHCVER=7.10.3+ compiler: ": #GHC 7.10.3"+ addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}+ - env: CABALVER=1.24 GHCVER=8.0.2+ compiler: ": #GHC 8.0.2"+ addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}+ - env: CABALVER=2.0 GHCVER=8.2.1+ compiler: ": #GHC 8.2.1"+ addons: {apt: {packages: [cabal-install-2.0,ghc-8.2.1,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}+ - env: CABALVER=head GHCVER=head+ compiler: ": #GHC head"+ addons: {apt: {packages: [cabal-install-head,ghc-head,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}} + allow_failures:+ - env: CABALVER=head GHCVER=head+ before_install: - unset CC - export HAPPYVER=1.19.5@@ -63,7 +72,6 @@ rm -rf $HOME/.cabsnap; mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin; cabal install --only-dependencies --enable-tests --enable-benchmarks;- if [ "$GHCVER" = "7.10.1" ]; then cabal install Cabal-1.22.4.0; fi; fi # snapshot package-db on cache miss
CHANGELOG.markdown view
@@ -1,3 +1,7 @@+5.0.2+-----+* Added `hoistCoyoneda`+ 5.0.1 ----- * Removed some redundant constraints
kan-extensions.cabal view
@@ -1,6 +1,6 @@ name: kan-extensions category: Data Structures, Monads, Comonads, Functors-version: 5.0.1+version: 5.0.2 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE@@ -47,6 +47,7 @@ containers >= 0.4 && < 0.6, contravariant >= 1 && < 2, distributive >= 0.2.2 && < 1,+ fail >= 4.9 && < 5, free >= 4 && < 5, mtl >= 2.0.1 && < 2.3, semigroupoids >= 4 && < 6,
src/Control/Monad/Co.hs view
@@ -64,6 +64,7 @@ import Control.Comonad.Store.Class import Control.Comonad.Traced.Class as Traced import Control.Monad.Error.Class+import qualified Control.Monad.Fail as Fail import Control.Monad.IO.Class import Control.Monad.Identity import Control.Monad.Reader.Class as Reader@@ -103,6 +104,9 @@ instance Comonad w => Monad (CoT w m) where return = pure CoT k >>= f = CoT (k . extend (\wa a -> runCoT (f a) wa))++instance (Comonad w, Fail.MonadFail m) => Fail.MonadFail (CoT w m) where+ fail msg = CoT $ \ _ -> Fail.fail msg instance Comonad w => MonadTrans (CoT w) where lift m = CoT (extract . fmap (m >>=))
src/Control/Monad/Codensity.hs view
@@ -32,6 +32,7 @@ import Control.Applicative import Control.Monad (MonadPlus(..))+import qualified Control.Monad.Fail as Fail import Control.Monad.Free import Control.Monad.IO.Class import Control.Monad.Reader.Class@@ -83,6 +84,10 @@ {-# INLINE return #-} m >>= k = Codensity (\c -> runCodensity m (\a -> runCodensity (k a) c)) {-# INLINE (>>=) #-}++instance (Fail.MonadFail f) => Fail.MonadFail (Codensity f) where+ fail msg = Codensity $ \ _ -> Fail.fail msg+ {-# INLINE fail #-} instance MonadIO m => MonadIO (Codensity m) where liftIO = lift . liftIO
src/Data/Functor/Coyoneda.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE UndecidableInstances #-}@@ -23,12 +24,12 @@ ---------------------------------------------------------------------------- module Data.Functor.Coyoneda ( Coyoneda(..)- , liftCoyoneda, lowerCoyoneda, lowerM+ , liftCoyoneda, lowerCoyoneda, lowerM, hoistCoyoneda -- * as a Left Kan extension , coyonedaToLan, lanToCoyoneda ) where -import Control.Applicative+import Control.Applicative as A import Control.Monad (MonadPlus(..), liftM) import Control.Monad.Fix import Control.Monad.Trans.Class@@ -84,21 +85,52 @@ {-# INLINE fmap #-} instance Apply f => Apply (Coyoneda f) where- m <.> n = liftCoyoneda $ lowerCoyoneda m <.> lowerCoyoneda n+ Coyoneda mf m <.> Coyoneda nf n =+ liftCoyoneda $ (\mres nres -> mf mres (nf nres)) <$> m <.> n {-# INLINE (<.>) #-}+ Coyoneda _ m .> Coyoneda g n = Coyoneda g (m .> n)+ {-# INLINE (.>) #-}+ Coyoneda f m <. Coyoneda _ n = Coyoneda f (m <. n)+ {-# INLINE (<.) #-} instance Applicative f => Applicative (Coyoneda f) where pure = liftCoyoneda . pure {-# INLINE pure #-}- m <*> n = liftCoyoneda $ lowerCoyoneda m <*> lowerCoyoneda n+ Coyoneda mf m <*> Coyoneda nf n =+ liftCoyoneda $ (\mres nres -> mf mres (nf nres)) <$> m <*> n {-# INLINE (<*>) #-}+ Coyoneda _ m *> Coyoneda g n = Coyoneda g (m *> n)+ {-# INLINE (*>) #-}+ Coyoneda f m <* Coyoneda _ n = Coyoneda f (m <* n)+ {-# INLINE (<*) #-} instance Alternative f => Alternative (Coyoneda f) where empty = liftCoyoneda empty {-# INLINE empty #-} m <|> n = liftCoyoneda $ lowerCoyoneda m <|> lowerCoyoneda n {-# INLINE (<|>) #-}+ some = liftCoyoneda . A.some . lowerCoyoneda+ {-# INLINE some #-}+ many = liftCoyoneda . A.many . lowerCoyoneda+ {-# INLINE many #-} +{-+-- These are slightly optimized versions of the *default*+-- `some` and `many` definitions for `Coyoneda`. I don't+-- know if it's worth the clutter to expose them.+someDefault (Coyoneda vf vb) = liftCoyoneda some_v+ where+ many_v = some_v <|> pure []+ some_v = (:) . vf <$> vb <*> many_v+{-# INLINE someDefault #-}++manyDefault (Coyoneda vf vb) = liftCoyoneda many_v+ where+ many_v = some_v <|> pure []+ some_v = (:) . vf <$> vb <*> many_v+{-# INLINE many #-}+-}+ instance Alt f => Alt (Coyoneda f) where m <!> n = liftCoyoneda $ lowerCoyoneda m <!> lowerCoyoneda n {-# INLINE (<!>) #-}@@ -118,6 +150,8 @@ #endif Coyoneda f v >>= k = lift (v >>= lowerM . k . f) {-# INLINE (>>=) #-}+ Coyoneda _ m >> Coyoneda g n = Coyoneda g (m >> n)+ {-# INLINE (>>) #-} instance MonadTrans Coyoneda where lift = Coyoneda id@@ -180,7 +214,7 @@ {-# INLINE showsPrec #-} #ifdef __GLASGOW_HASKELL__-instance (Functor f, Read (f a)) => Read (Coyoneda f a) where+instance Read (f a) => Read (Coyoneda f a) where readPrec = parens $ prec 10 $ do Ident "liftCoyoneda" <- lexP liftCoyoneda <$> step readPrec@@ -247,3 +281,8 @@ lowerM :: Monad f => Coyoneda f a -> f a lowerM (Coyoneda f m) = liftM f m {-# INLINE lowerM #-}++-- | Lift a natural transformation from @f@ to @g@ to a natural transformation+-- from @Coyoneda f@ to @Coyoneda g@.+hoistCoyoneda :: (forall a. f a -> g a) -> (Coyoneda f b -> Coyoneda g b)+hoistCoyoneda f (Coyoneda g x) = Coyoneda g (f x)
src/Data/Functor/Day.hs view
@@ -38,6 +38,8 @@ ) where import Control.Applicative+import Control.Comonad+import Control.Comonad.Trans.Class import Data.Distributive import Data.Functor.Identity import Data.Functor.Rep@@ -84,12 +86,28 @@ (\(a,c) (b,d) -> u a b (v c d)) instance (Representable f, Representable g) => Distributive (Day f g) where- distribute f = Day (tabulate id) (tabulate id) $ \x y -> fmap (\(Day m n o) -> o (index m x) (index n y)) f+ distribute f = Day (tabulate id) (tabulate id) $ \x y ->+ fmap (\(Day m n o) -> o (index m x) (index n y)) f + collect g f = Day (tabulate id) (tabulate id) $ \x y ->+ fmap (\q -> case g q of Day m n o -> o (index m x) (index n y)) f+ instance (Representable f, Representable g) => Representable (Day f g) where type Rep (Day f g) = (Rep f, Rep g) tabulate f = Day (tabulate id) (tabulate id) (curry f) index (Day m n o) (x,y) = o (index m x) (index n y)++instance (Comonad f, Comonad g) => Comonad (Day f g) where+ extract (Day fb gc bca) = bca (extract fb) (extract gc)+ duplicate (Day fb gc bca) = Day (duplicate fb) (duplicate gc) (\fb' gc' -> Day fb' gc' bca)++instance (ComonadApply f, ComonadApply g) => ComonadApply (Day f g) where+ Day fa fb u <@> Day gc gd v =+ Day ((,) <$> fa <@> gc) ((,) <$> fb <@> gd)+ (\(a,c) (b,d) -> u a b (v c d))++instance Comonad f => ComonadTrans (Day f) where+ lower (Day fb gc bca) = bca (extract fb) <$> gc -- | Day convolution provides a monoidal product. The associativity -- of this monoid is witnessed by 'assoc' and 'disassoc'.