這可能是您的情況屬於簡單的圖案,其中你的單子,如果下面的形式:
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