我有一些麻煩搞清楚/如何/綁定操作實際上綁定在一起以下國家的單子:哈斯克爾 - 單子約束力的評估順序
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
採取doStuff
,可脫到以下幾點:
pop >>= (\_ -> pop >>= (\x -> push 5 >>= (\_ -> push x)))
當這條線被評估時,綁定實際發生的順序是什麼?因爲要實際綁定,Haskell需要從>>=
運算符右邊的函數中獲得狀態monad(即,需要首先充分評估函數右操作數),但我會認爲會發生以下情況:
- S1 =
push 5 >>= (\_ -> push x)
- S2 =
pop >>= (\x -> s1)
- S3 =
pop >>= (\_ -> s2)
這是考慮它的正確方法?我覺得我很好地理解單子,但是我最大的問題在於真正想象「幕後」發生了什麼,以及數據如何流動,可以這麼說。 do
表示法給出了我正在處理一系列順序操作的錯覺,實際上,有大量的嵌套和閉包。
我感覺有點像我在這裏過度思考的事情,並進一步混淆了我自己。
您應該從狀態monad擴展'>> ='的定義,以瞭解發生了什麼。沒有什麼特別的,只是普通的評估。 – augustss 2013-04-10 13:09:59
評估策略在這裏並不重要,所以沒有正確的方法來考慮它。通過嘗試不同的評估方式,您可以輕鬆看到這一點。結果將始終如一。 – 2013-04-10 18:47:20