Rand monad的MonadFix实例

Ten*_*ner 4 random monads haskell monadfix

我想用System.Random.MWC.Monad中的 Rand monad生成无限的数字流.如果只有这个monad的MonadFix实例,或者像这样的实例:

instance (PrimMonad m) => MonadFix m where
     ...
Run Code Online (Sandbox Code Playgroud)

然后人们可以写:

runWithSystemRandom (mfix (\ xs -> uniform >>= \x -> return (x:xs)))
Run Code Online (Sandbox Code Playgroud)

虽然没有一个.

我正在浏览MonadFix文档,但我没有看到实现此实例的明显方法.

Hea*_*ink 6

您可以编写MonadFix实例.但是,代码不会生成不同的随机数流.mfix的参数是一个只调用uniform一次的函数.运行代码时,它将只调用uniform一次,并创建一个包含结果的无限列表.

您可以尝试等效的IO代码来查看发生的情况:

import System.Random
import Control.Monad.Fix
main = print . take 10 =<< mfix (\xs -> randomIO >>= (\x -> return (x : xs :: [Int])))
Run Code Online (Sandbox Code Playgroud)

您似乎想要使用有状态随机数生成器,并且您希望运行生成器并懒惰地收集其结果.如果不仔细使用,这是不可能的unsafePerformIO.除非您需要快速生成许多随机数,否则您可以使用纯RNG函数randomRs.