kan-extensions 3.5.1 → 3.6
raw patch · 5 files changed
+69/−20 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Functor.Yoneda: instance Monad m => MonadSpec (Yoneda m)
Files
- CHANGELOG.markdown +4/−0
- README.markdown +1/−1
- kan-extensions.cabal +1/−1
- src/Data/Functor/Yoneda.hs +21/−1
- src/Data/Functor/Yoneda/Reduction.hs +42/−17
CHANGELOG.markdown view
@@ -1,3 +1,7 @@+3.6+---+* `instance Monad m => MonadSpec (Yoneda m)`+ 3.5.1 ----- * Fixed a bug in the signature for `composedRepToCodensity`.
README.markdown view
@@ -9,7 +9,7 @@ * Right and left Kan extensions (`Ran` and `Lan`) * Right and left Kan lifts (`Rift` and `Lift`)-* Both forms of the Yoneda lemma as Kan extensions (`Yoneda`)+* Multiple forms of the Yoneda lemma (`Yoneda`) * The `Codensity` monad, which can be used to improve the asymptotic complexity of code over free monads (`Codensity`, `Density`) * A "comonad to monad-transformer transformer" that is a special case of a right Kan lift. (`CoT`, `Co`)
kan-extensions.cabal view
@@ -1,6 +1,6 @@ name: kan-extensions category: Data Structures, Monads, Comonads, Functors-version: 3.5.1+version: 3.6 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE
src/Data/Functor/Yoneda.hs view
@@ -1,7 +1,17 @@-{-# LANGUAGE TypeFamilies, CPP, Rank2Types, FlexibleContexts, MultiParamTypeClasses, UndecidableInstances, FlexibleInstances #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-} #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 {-# LANGUAGE Trustworthy #-} #endif++#ifndef MIN_VERSION_speculation+#define MIN_VERSION_speculation(x,y,z) 1+#endif ----------------------------------------------------------------------------- -- | -- Module : Data.Functor.Yoneda@@ -35,6 +45,8 @@ import Control.Monad.Trans.Class import Control.Comonad import Control.Comonad.Trans.Class+import Control.Concurrent.Speculation+import Control.Concurrent.Speculation.Class import Data.Distributive import Data.Foldable import Data.Function (on)@@ -49,6 +61,14 @@ import Data.Traversable import Text.Read hiding (lift) import Prelude hiding (sequence, lookup, zipWith)++instance Monad m => MonadSpec (Yoneda m) where+ specByM f g a = Yoneda $ \k -> specBy f g (return . k) a+ {-# INLINE specByM #-}+#if !(MIN_VERSION_speculation(1,5,0))+ specByM' f g a = Yoneda $ \k -> specBy' f g (return . k) a+ {-# INLINE specByM' #-}+#endif newtype Yoneda f a = Yoneda { runYoneda :: forall b. (a -> b) -> f b }
src/Data/Functor/Yoneda/Reduction.hs view
@@ -1,7 +1,14 @@-{-# LANGUAGE CPP, GADTs, FlexibleContexts, MultiParamTypeClasses, UndecidableInstances, TypeFamilies #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE TypeFamilies #-}+ #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 {-# LANGUAGE Trustworthy #-} #endif+ ----------------------------------------------------------------------------- -- | -- Copyright : (C) 2011-2013 Edward Kmett@@ -15,7 +22,7 @@ -- -- <http://ncatlab.org/nlab/show/Yoneda+reduction> ----- @Yoneda f@ is isomorphic to @Lan f Identity@+-- @'Yoneda' f@ is isomorphic to @'Lan' f 'Identity'@ ---------------------------------------------------------------------------- module Data.Functor.Yoneda.Reduction ( Yoneda(..)@@ -49,21 +56,6 @@ data Yoneda f a where Yoneda :: (b -> a) -> f b -> Yoneda f a --- | Yoneda "expansion"-liftYoneda :: f a -> Yoneda f a-liftYoneda = Yoneda id-{-# INLINE liftYoneda #-}---- | Yoneda reduction-lowerYoneda :: Functor f => Yoneda f a -> f a-lowerYoneda (Yoneda f m) = fmap f m-{-# INLINE lowerYoneda #-}---- | Yoneda reduction given a 'Monad'.-lowerM :: Monad f => Yoneda f a -> f a-lowerM (Yoneda f m) = liftM f m-{-# INLINE lowerM #-}- instance Functor (Yoneda f) where fmap f (Yoneda g v) = Yoneda (f . g) v {-# INLINE fmap #-}@@ -218,3 +210,36 @@ {-# INLINE unit #-} counit = counit . fmap lowerYoneda . lowerYoneda {-# INLINE counit #-}++-- | Yoneda "expansion"+--+-- @+-- 'liftYoneda' . 'lowerYoneda' ≡ 'id'+-- 'lowerYoneda' . 'liftYoneda' ≡ 'id'+-- @+--+--+-- @+-- 'lift' = 'liftYoneda'+-- @+liftYoneda :: f a -> Yoneda f a+liftYoneda = Yoneda id+{-# INLINE liftYoneda #-}++-- | Yoneda reduction+--+-- @+-- 'lower' = 'lowerM' = 'lowerYoneda'+-- @+lowerYoneda :: Functor f => Yoneda f a -> f a+lowerYoneda (Yoneda f m) = fmap f m+{-# INLINE lowerYoneda #-}++-- | Yoneda reduction given a 'Monad'.+--+-- @+-- 'lower' = 'lowerM' = 'lowerYoneda'+-- @+lowerM :: Monad f => Yoneda f a -> f a+lowerM (Yoneda f m) = liftM f m+{-# INLINE lowerM #-}