【发布时间】:2016-01-10 00:04:58
【问题描述】:
所以我的目标是能够调用一个非单子函数并让它返回一个随机值。
getNums :: [Int] -- this only works when the type signature is "IO [Int]"
getNums = getListFromIO 10
getListFromIO :: Int -> IO [Int]
getListFromIO n = do
gen <- newStdGen
return $ generateList n gen
generateList :: Int -> StdGen -> [Int]
generateList n gen = take n $ randomRs (1,9) $ gen
如果我打电话给getListFromIO,一切都很好;我得到了我珍贵的随机整数列表,每次都不一样。但是调用它的每个函数都必须使用IO [Int] 类型签名。我不想那样。
我如何构造它以便能够获得[Int] 类型的随机数列表?
【问题讨论】:
-
你不能。
IO类型的全部意义在于阻止您执行此操作。如果你可以,它会破坏你的程序。相反,您应该询问如何使用getNums :: IO [Int],以使您可以使用它在其他函数中计算的[Int]值。这就是Monad和Functor类型类方法的用途。 -
如果您喜欢冒险,可以使用
unsafePerformIO。注意 unsafe 位。 -
请不要将
unsafePerformIO推荐给不了解使用它的危险后果或没有它的情况下编写 Haskell 的惯用方式的人。这是有害的。 -
我更愿意学习正确的方法
-
再一次,这不是建议,而是一些相关的信息,可以引起人们的兴趣并提供一些教育价值(如果他在使用它时遇到一些问题)。我非常怀疑 OP 是在写生产代码,所以你用枪的类比在这里不适用。
标签: haskell random monads type-signature