这个Monad实例是否遵循monadic法则?

时间:2016-09-18 12:17:08

标签: haskell monads

我是Haskell的新手,我试图弄清楚以下代码片段是否符合Monad Laws。

newtype SubsM a = SubsM {runSubsM :: Context -> Either Error (a, Env)}

instance Functor SubsM where
  fmap f m = m >>= \a -> return (f a)

instance Applicative SubsM where
  pure = return; (<*>) = ap

instance Monad SubsM where
    return x = SubsM (\ctx -> Right (x, fst ctx))
    SubsM m >>= f = SubsM $ \c -> case m c of 
        Left(Error s) -> Left(Error s)
        Right (a, env) -> runSubsM (f a) (env, snd c)
    fail s = SubsM $ \c -> Left(Error s)

在右侧,monad包含状态,在这种情况下可能包含错误消息,而在左侧包含上下文。我一直在查阅monadic法律,其中说明:   - 我们需要获得monad的左侧部分(左侧身份)
  - 我们需要获得monad的正确部分(正确的身份)
  - 我们需要能够链接函数(关联性)

0 个答案:

没有答案