我是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的正确部分(正确的身份)
- 我们需要能够链接函数(关联性)