【发布时间】:2019-08-10 09:36:01
【问题描述】:
我想在我的StateT a STM b 中运行randomIO,但出现此错误:
Expected type: StateT Session STM Float
Actual type: IO Float
所以我从Control.Monad.Trans.Class 尝试lift'ing(由 State 的 Strict 模块重新导出):
Expected type: StateT Session STM Float
Actual type: StateT Session IO Float
它更接近但不完全在那里。我不能liftIO,因为STM 没有MonadIO 实例。
我怎样才能编译它,以便我可以在 STM 内运行 randomIO 在我的 StateT 内?
【问题讨论】:
-
嗯,Monad 转换器环绕
STM Float,而不是IO Float。 -
你不能在 STM 中运行 IO 动作,甚至
randomIO也不能。您需要找到一种解决方法,例如在进入 STM 之前预先生成随机数,或者在 STM 中传递 RNG 状态。 -
您可以使用
unsafeIOToSTM,但顾名思义:这是不安全的,因此您最好不要这样做。 -
@WillemVanOnsem,在某些情况下可能没问题。如果选择的随机数不影响交易成功的概率,那么它应该是完全没问题的。我会影响它,然后它会修改有效的分布,这可能是也可能不是可接受的。也就是说,随机数生成所花费的时间可能比您在 STM 交易中真正想要花费的时间要长。
标签: haskell monad-transformers state-monad stm io-monad