Haskell随机IO到Int

时间:2018-02-22 01:20:03

标签: haskell random io functional-programming monads

我最近选择了Haskell,语法对我来说真的很混乱。我试图使用

获得0到51之间的随机数
randomRIO (0, 51)

但我不知道如何使它成为一个实际的Int(现在它的类型IO a)。 我相信你应该能做到:

gen <- randomRIO (0, 51)

然后gen应该是一个Int,但我必须在do块中这样做?如何创建获取此函数并返回Int的函数。 从googeling我害怕有一些我不理解的基本知识。 我完全迷失了。

1 个答案:

答案 0 :(得分:16)

是的,有一些基本的东西,这是新Haskellers最常遇到的事情。基本上,你所说的一切都是正确的,如果你想要一个&#34;功能&#34;返回一个随机的int,你不能拥有它。

你可以做到

main :: IO ()
main = do
    num <- getRandomR (0, 51)
    putStrLn ("The number is " ++ show num)

您也可以将其分解出来

getCardIndex :: IO Int
getCardIndex = do
    ix <- getRandomR (0,51)
    return (ix + 1)   -- just as an example of how you can transform it

main :: IO ()
main = do
    card <- getCardIndex
    putStrLn ("The number is " ++ show card)

你不能做的就是让它成为一个纯粹的功能/价值:

pureCardIndex :: Int
pureCardIndex = ioToPure (getRandomR (0,51)) -- NOT POSSIBLE

因为没有像ioToPure这样的(道德)功能。纯函数必须始终为同一输入返回相同的输出,这正是您希望随机数函数执行的操作。所以我们必须使用IO。使用IO生成随机内容后,依赖于该随机数的任何内容也必须位于IO中。

人们将很快开始解释monad的理论及其所有这些,并且它是好东西,我只是建议耐心地接近它,在进入理论方面之前习惯这些模式。