这可能是您的情况属于简单的图案,其中你的单子,如果下面的形式:
newtype MyMonad a = MyMonad { run :: State -> (a, State) }
其中State
是你设计自己的数据类型。该点你可能有一个功能:
run :: MyMonad a -> State -> (a, State)
,你可能需要使用此功能在实现时(>> =):
m >>= f = MyMonad(\state -> let (x, newState) = run m state in
case x of
(ParticularParameterA) -> doSomething
..........
现在,如果你f::a -> MyMonad b
功能\state -> ...
必须返回一个(b, State)
,所以你可能想在你的代码中使用run (f x) newState
。
如果你的单子类型的形式为:
newtype MyMonad a = MyMonad { run :: State -> Maybe (a, State) }
newtype MyMonad a = MyMonad { run :: State -> Either String (a, State) }
那么你还是使用run
功能,例如
m >>= f = MyMonad (\state -> case run m state of
Just (x, newState) -> run (f x) newState
Nothing -> Nothing)
'm'应该已经有一个固定的类型,通过monad实例,所以不应该有切换需要也不可能。你的意思是你选择/切换monad类型的构造函数吗? – MicroVirus
是的,确实如此。我编辑过。 – Gilgamesz
你的编辑只是让代码变得荒谬,在do-block/list理解之外有一个'<-'。 – MicroVirus