/どのように/バインド演算子が実際に次の State モナドをバインドするかを理解するのに苦労しています:
pop :: State [Int] Int
pop = do
(x:xs) <- get
put xs
return x
push :: Int -> State [Int] ()
push x = do
xs <- get
put (x:xs)
doStuff :: State [Int] ()
doStuff = do
pop
x <- pop
push 5
push x
Take doStuff
、次のように脱糖できます。
pop >>= (\_ -> pop >>= (\x -> push 5 >>= (\_ -> push x)))
この行が評価されると、バインディングは実際にどのような順序で行われるのでしょうか? 実際にバインドするには、Haskell は演算子の右側の関数から State モナドを取得する必要があるため>>=
(つまり、関数の右側のオペランドを最初に完全に評価する必要があります)、次のようになると考えていました。
- s1 =
push 5 >>= (\_ -> push x)
- s2 =
pop >>= (\x -> s1)
- s3 =
pop >>= (\_ -> s2)
これはそれについて考える正しい方法ですか?モナドについてはよく理解できたと思いますが、最大の問題は、いわば「舞台裏」で何が起こっているか、データがどのように流れているかを実際に視覚化することです。このdo
表記法は、一連の一連の操作を扱っているような錯覚を与えますが、実際には、ネストとクロージャーがたくさんあります。
ここで物事を考えすぎて、結果として自分自身をさらに混乱させているような気がします。