【问题标题】:Haskell IO action in `StateT a STM b``StateT a STM b` 中的 Haskell IO 操作
【发布时间】: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


【解决方案1】:

根据 cmets,我正在尝试一些愚蠢的事情。相反,我使用randomRs (0.0, 1.0) g 将我需要的随机Floats 列表传递给我的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多