私は、次のような機能を通じてStateモナドを渡すために探しています:Stateモナドによる計算のバインディングは?
e1 :: Int -> (Bool, Int)
e1 el
| el > 100 = (True, el)
| otherwise = (False, 0)
e2 :: Int -> (Bool, Int)
e2 el
| el > 200 = (True, el)
| otherwise = (False, 0)
e3 :: Int -> (Bool, Int)
e3 el
| el > 300 = (True, el)
| otherwise == (False, 0)
implementor :: State Bool Int
implementor = state e1 ...
main = do
print $ runState implementor 10
現在runState
はState s a
(implementor
)が渡された値(10)、その後、e1
からタプルを返しています。
私は、次のような、一緒にこれらの操作をバインドしたいのですが:
state e1 >>= e2 >>= e3
e1
はState Bool Int
Int
(el
経由)で動作するe2
に、それはにState Bool Int
を結果ズパスの通過しますe3
であり、これは再び、この着信状態のInt
で動作します。
:、私はバインドのこのインスタンスがやって、どのようにe1
をバインドするためにこれを使用することです理解していない
instance Monad (State s) where
return :: state $ \s -> (s, a)--this is returning a State which contains function (s -> (s, a))
m >>= k = state $ \s -> let (a, s') = runState m s --?
in runState (k a) s'
e2
とe3
一緒に?
あなたは 'state e1 >> state e2 >> state e3'を探していますか? – Zeta
@Zetaわかりやすく私の質問に追加しました –
「状態e1」は「状態Bool Int」ではなく「状態Int Bool」です。 – Zeta