2016-08-23 56 views
1

我是新来的Haskell,我用从randomRIO功能使用IO诠释问题的功能,使用从randomRIO随机整数。我的目标是获得一个随机的Int值,比如说r,并且返回True,否则返回false,但我不知道如何去做。哈斯克尔:如何在返回boolean

我的功能看起来应该像:

randomCompare :: Int->Bool 

randomCompare x 

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

    | otherwise = False     

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

谢谢。

+0

这是不可能的类型做'内部 - > Bool',因为一个函数的结果只取决于它的输入,这里唯一的输入是多少。如果你还传入随机数,那么你有'randomCompare x r = x immibis

回答

5
import System.Random(randomIO) 

randomCompare :: Int -> IO Bool 
randomCompare x = do 
    r <- randomIO 
    return $ x < r 

IO既不好也不坏,它只是声明你的函数有副作用。这里副作用是修改全局随机数生成器的状态,以便随后调用randomIO将给出另一个数字(如果它是常量,它不会是随机的!)。

IO不强制所有的调用函数是IO太(即要使用的IO布尔的那些)。但是,如果调用函数是IO只消耗这个IO布尔,如果没有其他副作用,那么你可以把它作为一个纯函数f :: Bool -> SomeType分离和functorially它适用于IO,即

f <$> randomCompare i 

所以在IO单子只售由函子fmap代替普通函数调用$,也注意到<$>。键入的时间太长了吗?

如果你绝对要离开IO单子(为什么?),你也可以画出你所需要的第一随机值,将其存储在一个列表,然后在名单上应用纯函数。

+0

感谢您的回答。 所以我明白没有IO没有优雅的方式。不过,调用“randomCompare”的函数只需要Bool值,那么调用函数应该如何处理IO Bool而不是Bool呢? 谢谢。通过'MonadRandom M =>内部> IO Bool' - - >米Bool' –

+2

如果导入Control.Monad.Random以及使用该MonadRandom封装,可以更换'诠释。然后你仍然可以使用它,就好像它是'Int - > IO Bool'一样,但是你有类型级的保证,该函数没有任何其他副作用,而不是产生随机数。 – Gurkenglas

+0

无限的随机列表也很常见。 randomCompare :: RandList - > Int - >(Bool,RandList)'where RandList = [Int]''和'randomCompare(x:xs)i =(i