【发布时间】:2013-07-07 21:08:28
【问题描述】:
只是学习如何更直观地掌握单子和转换器;很多看起来很明显的事情对我来说仍然有点棘手哈哈。
所以我有一个位于Rand monad 中的计算,但在里面,还有另一个“子计算”(或多个)位于ST monad(或State monad,不管怎样……ST 仅用于性能,但我认为 State 在这种情况下也同样有效)。
整个计算不需要在 ST monad 内......并且这个子计算将以不同的起始状态多次调用,所以我不想将整个事情强制转换为 @ 987654327@(除非这是惯用方式)。
没有随机性,结构如下:
main = print mainComp
mainComp :: Int
mainComp = otherComp + (subComp 1) + (subComp 2)
subComp :: Int -> Int
subComp n = runST $ do
-- generate state based on n
-- ...
replicateM_ 100 mutateState
-- ...
-- eventually returns an ST s Int
mutateState :: ST s ()
mutateState = -- ...
基本上一切都很好,mainComp 和 subComp 的引用完全透明。
这就是我目前使用Rand 的方式--
main = (evalRandIO mainComp) >>= print
mainComp :: (RandomGen g) => Rand g Int
mainComp = do
subResultA <- subComp 1
subResultB <- subComp 2
return $ otherComp + subResultA + subResultB
subComp :: (RandomGen g) => Int -> Rand g Int
subComp = return $ runST $ do -- is this ok to just throw in return?
-- generate state based on n
-- ...
replicateM_ 100 mutateState
-- ...
-- eventually returns an ST s Int (??)
mutateState :: ??
mutateState = ??
如果我想使用随机种子和其中的Rand monad,mutateState 应该是什么类型?我想我可能想使用RandT g (ST s) () 的返回类型,但我如何使它与subComp 中的runST 中预期的类型相匹配?
【问题讨论】:
标签: haskell monads monad-transformers