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

Noo*_*bot 2 random haskell

我是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值在上下文中纯度等.但我不明白为什么使用布尔函数的随机数应该是"坏".

谢谢.

V. *_*ria 6

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

  • 如果导入Control.Monad.Random并使用MonadRandom包,则可以用`MonadRandom m => Int - > m Bool`替换`Int - > IO Bool`.然后你仍然可以使用它,好像它是`Int - > IO Bool`,但你有类型级保证,该函数除了生成随机数之外没有任何其他副作用. (2认同)