-- | a monad that strictly evaluates intermediate return values.
module Strict (Strict(..)) where
import Control.Applicative
-- import Control.Monad
newtype Strict a = Strict { runStrict :: a }
instance Functor Strict where
fmap f (Strict a) = Strict (f a)
instance Applicative Strict where
pure = Strict
(<*>) (Strict f) (Strict a) = Strict (f a)
instance Monad Strict where
return = Strict
(>>=) (Strict a) fn = fn a