我是Haskell的新手,我在使用randomRIO函数的IO Int时遇到了问题。我的目标是得到一个随机的Int值,比如说r,如果r 我的功能应该如下: 我知道有一个设计意图是将IO值保持在纯度等的上下文中。但我不明白为什么使用布尔函数的随机数应该是“坏”。 感谢。randomCompare :: Int->Bool
randomCompare x
| x < r = True -- somehow i want to r <- randomRIO(start,end)
| otherwise = False
答案 0 :(得分:6)
import System.Random(randomIO)
randomCompare :: Int -> IO Bool
randomCompare x = do
r <- randomIO
return $ x < r
IO既不好也不坏,只是声明你的功能有副作用。这里的副作用是修改全局随机数生成器的状态,以便随后对randomIO的调用将给出另一个数字(如果它是常数则不会是随机的!)。
IO确实强制所有调用函数也是IO(那些想要使用IO Bool的函数)。但是,如果一个调用函数只是通过消耗这个IO Bool而是IO,如果它没有其它副作用,那么你可以将它作为一个纯函数f :: Bool -> SomeType
分离并在IO上进行函数化,即
f <$> randomCompare i
因此,IO monad只需花费您用函数$
替换普通函数调用fmap
,也注明<$>
。输入时间要长得多吗?
如果您绝对想要离开IO monad(为什么?),您还可以先绘制所需的所有随机值,将它们存储在列表中,然后在该列表中应用纯函数。