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文档,但我没有看到实现此实例的明显方法.
您可以编写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.