on master help sign in
Define all methods of Functor, Applicative and Monad
commitd237efe37907b797aafb2aeaf06fca8429da164c authorAndrzej Rybczak <andrzej@rybczak.net> dateTue 22 Jun 2021, 17:31 (5 years ago) parente631452
1 file changed+15−3
src/Effectful/Internal/Monad.hs+15−3
src/Effectful/Internal/Monad.hs+15−3
@@ -1,4 +1,6 @@
1+{-# LANGUAGE CPP #-}
12{-# LANGUAGE UndecidableInstances #-}
3+{-# OPTIONS_GHC -Wno-noncanonical-monad-instances #-}
24{-# OPTIONS_HADDOCK not-home #-}
35-- | The 'Eff' monad.
46--
@@ -28,6 +30,7 @@ module Effectful.Internal.Monad
2830 , stateEffectM
2931 ) where
3032
33+import Control.Applicative (liftA2)
3134import Control.Concurrent (myThreadId)
3235import Control.Monad.Base
3336import Control.Monad.Catch
@@ -70,15 +73,24 @@ unsafeUnliftEff f = unsafeEff $ \es -> do
7073
7174instance Functor (Eff es) where
7275 fmap f (Eff m) = unsafeEff $ \es -> f <$> m es
76+ a <$ Eff fb = unsafeEff $ \es -> a <$ fb es
7377
7478instance Applicative (Eff es) where
7579 pure = unsafeEff_ . pure
7680 Eff mf <*> Eff mx = unsafeEff $ \es -> mf es <*> mx es
81+ Eff ma *> Eff mb = unsafeEff $ \es -> ma es *> mb es
82+ Eff ma <* Eff mb = unsafeEff $ \es -> ma es <* mb es
83+ liftA2 f (Eff ma) (Eff mb) = unsafeEff $ \es -> liftA2 f (ma es) (mb es)
7784
7885instance Monad (Eff es) where
79− Eff m >>= k = unsafeEff $ \es -> do
80− a <- m es
81− unEff (k a) es
86+ return = unsafeEff_ . pure
87+ Eff m >>= k = unsafeEff $ \es -> m es >>= \a -> unEff (k a) es
88+ -- https://gitlab.haskell.org/ghc/ghc/-/issues/20008
89+ Eff ma >> Eff mb = unsafeEff $ \es -> ma es >> mb es
90+
91+#if __GLASGOW_HASKELL__ < 808
92+ fail = unsafeEff_ . fail
93+#endif
8294
8395----------------------------------------
8496-- Exception