RoyalMonad 1000.0 → 1000.1
raw patch · 2 files changed
+47/−25 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Control/Monad/Royal.hs +46/−24
- RoyalMonad.cabal +1/−1
Control/Monad/Royal.hs view
@@ -1,50 +1,72 @@+-----------------------------------------------------------------------------+-- |+-- Module : Control.Monad.Royal+-- Copyright : (c) Atze van der Ploeg 2015+-- License : BSD-style+-- Maintainer : atzeus@gmail.org+-- Stability : royal+-- Portability : royal+--+-- Introducing his majesty the Royal Monad+--+-- Royal Monads (or relative polymonads) generalize monads, polymonads _and_ relative monads.+--+-- Therefore Royal Monads (capitalize to emphasise royalness) are the king of monads! +-- +-- The ultimate abstraction! +-- +-- Ditch your boring old relative, poly or ordinary monad, and start programming with the king of monads! +-- +-- Bow before the ultimate generality of the Royal Monad, infidels!+ {-# LANGUAGE UndecidableInstances,FlexibleInstances,MultiParamTypeClasses #-} module Control.Monad.Royal where-{- -Royal Monads (or relative polymonads) generalize monads, polymonads _and_ relative monads. -Therefore Royal Monads (captalize to emphasise royalness) are the king of monads! --The ultimate abstraction! --Ditch your boring old (relative) (poly) monad, and start programming-with the king of monads! --Bow before the ultimate generality of the Royal Monad, infidels!--}- class RoyalReturn m r where royalReturn :: r a -> m a +{- |+ laws:+@ + royalBind m royalReturn = m+ royalBind (royalReturn x) f = f x + royalBind m (\x -> royalBind (f x) g) = royalBind (royalBind m f) g+@+-} class (RoyalReturn m r, RoyalReturn n r, RoyalReturn p r) => RoyalMonad m n p r where royalBind :: m a -> (r a -> n a) -> p a- -- laws:- -- royalBind m royalReturn = m- -- royalBind (royalReturn x) f = f x - -- royalBind m (\x -> royalBind (f x) g) = royalBind (royalBind m f) g +{- | Relative monads+ laws:+@ +relativeBind m royalReturn = m+relativeBind (royalReturn x) f = f x +relativeBind m (\x -> relativeBind (f x) g) = relativeBind (relativeBind m f) g+@+-} class RoyalReturn m r => RelMonad m r where relativeBind :: m a -> (r a -> m b) -> m b- -- laws:- -- relativeBind m royalReturn = m- -- relativeBind (royalReturn x) f = f x - -- relativeBind m (\x -> relativeBind (f x) g) = relativeBind (relativeBind m f) g class NonRoyalReturn m where rreturn :: a -> m a ++{- | Relative monads+ laws:+@ +polyBind m rreturn = m+polyBind (rreturn x) f = f x +polyBind m (\x -> polyBind (f x) g) = polyBind (polyBind m f) g+@+-} class (NonRoyalReturn m, NonRoyalReturn n, NonRoyalReturn p) => PolyMonad m n p where polyBind :: m a -> (a -> n b) -> p b- -- laws:- -- polyBind m rreturn = m- -- polyBind (rreturn x) f = f x - -- polyBind m (\x -> polyBind (f x) g) = polyBind (polyBind m f) g newtype Id a = Id { fromId :: a}
RoyalMonad.cabal view
@@ -1,5 +1,5 @@ Name: RoyalMonad-Version: 1000.0+Version: 1000.1 Synopsis: All hail the Royal Monad! Description: All hail the Royal Monad! License: BSD3