それはあなたの状況は、単純なパターンに陥る可能性がある場所であればフォームのごモナド:State
はあなた自身を設計したデータ型である
newtype MyMonad a = MyMonad { run :: State -> (a, State) }
。ポイントは、あなたはおそらく機能していされています
run :: MyMonad a -> State -> (a, State)
を、あなたはおそらく、(>> =)を実装する際に、この機能を使用する必要があります。
今
m >>= f = MyMonad(\state -> let (x, newState) = run m state in
case x of
(ParticularParameterA) -> doSomething
..........
あなた\state -> ...
機能が(b, State)
を返す必要がありますf::a -> MyMonad b
場合、だからおそらくあなたのコードのどこかに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」は、モナドインスタンスによって固定タイプである必要があります。したがって、切り替えが必要ないし、可能でもないはずです。モナドタイプのコンストラクタを選択/切り替えていることを意味しますか? – MicroVirus
はい、確かにあります。私は編集しました。 – Gilgamesz
あなたの編集はコードを無意味なものにしました。doブロック/リストの理解の外に '<'があります。 – MicroVirus