[英]How to nondeterministically put a value in a state?
在下面的代碼中,如何將put 1
替換為在該狀態下插入非確定性1或2的代碼?
import Control.Monad.List
import Control.Monad.Trans.State
test :: StateT Int [] Int
test = do
put 1
v <- get
return v
你的monad堆棧簽名已經是正確的了。
從[]
monad中提取計算並綁定到其值。 這將分叉計算:
test :: StateT Int [] Int
test = do
s <- lift [1,2,3]
put s
v <- get
return v
測試看它是否有效:
*Main> runStateT test 10
[(1,1),(2,2),(3,3)]
不僅有很多結果,而且國家也包含在非確定性中。
如果test
有類型ListT (State Int) Int
,只有結果是非確定的,狀態將在計算中的所有分支之間共享 :
test :: ListT (State Int) Int
test = do
s <- ListT $ return [1,2,3]
put s
v <- get
return v
結果:
*Main> runState (runListT test) 10
([1,2,3],3)
也許你想要這樣的東西:
import Control.Monad.List
import Control.Monad.Trans.State
import System.Random (randomIO)
test :: StateT Int IO Int
test = do
put1 <- liftIO $ randomIO
put (if put1 then 1 else 2)
v <- get
return v
這將使用全局生成器隨機設置1或2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.