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