簡體   English   中英

如何不確定地將價值置於某個州?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM