semantics monad
class (Functor f, Monad m) => MonadSem f m | m -> f wheren
lazily :: m a -> m (f a)
force :: f a -> m a
-- fmap (fmap f) . lazily = lazily . fmap f
-- fmap lazily . lazily = lazily . lazily
-- lazily . pure = pure . pure
-- join . lazily = id