Haskell:如何在返回布尔值的函数中使用来自randomRIO的随机整数

时间:2016-08-23 13:39:26

标签: haskell random

我是Haskell的新手,我在使用randomRIO函数的IO Int时遇到了问题。我的目标是得到一个随机的Int值,比如说r,如果r

我的功能应该如下:

randomCompare :: Int->Bool

randomCompare x

  | x < r = True -- somehow i want to r <- randomRIO(start,end) 

  | otherwise = False                

我知道有一个设计意图是将IO值保持在纯度等的上下文中。但我不明白为什么使用布尔函数的随机数应该是“坏”。

感谢。

1 个答案:

答案 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(为什么?),您还可以先绘制所需的所有随机值,将它们存储在列表中,然后在该列表中应用纯函数。