Bob*_*Bob 4 monads haskell non-deterministic state-monad monad-transformers
在下面的代码中,如何替换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
Run Code Online (Sandbox Code Playgroud)
你的monad堆栈签名已经是正确的了.
从[]monad中提取计算并绑定到其值.这将分叉计算:
test :: StateT Int [] Int
test = do
s <- lift [1,2,3]
put s
v <- get
return v
Run Code Online (Sandbox Code Playgroud)
测试看它是否有效:
*Main> runStateT test 10
[(1,1),(2,2),(3,3)]
Run Code Online (Sandbox Code Playgroud)
不仅有很多结果,而且国家也包含在非确定性中.
如果test有类型ListT (State Int) Int,只有结果是非确定的,状态将在计算中的所有分支之间共享:
test :: ListT (State Int) Int
test = do
s <- ListT $ return [1,2,3]
put s
v <- get
return v
Run Code Online (Sandbox Code Playgroud)
结果:
*Main> runState (runListT test) 10
([1,2,3],3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |