Haskell: 随机数 - Int of IO action

Haskell: random number - Int of IO action

我最近学习了 Haskell,语法真的让我很困惑。我正在尝试使用以下方法获取 0 到 51 之间的随机数:

randomRIO (0, 51)

但我不知道如何使它成为实际的 Int(而不是 IO Int)。

我相信你应该能够做到:

gen <- randomRIO (0, 51)

然后 gen 应该是 Int,但我必须在 do 块中执行此操作 - 我如何创建采用此和 returns一个Int?

Google 恐怕有些基本的东西我不明白。我完全迷路了。

是的,有一些基本的东西,这是新的 Haskellers 最常见的问题。基本上,你说的都是对的,如果你想要一个 "function" 那 return 是一个随机整数,你不能拥有它。

你可以做到

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)

你不能做的就是让它成为一个纯粹的function/value:

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

因为没有像ioToPure这样的(道德)功能。纯函数必须始终 return 相同输入的相同输出,这恰恰是 而不是 您希望随机数函数执行的操作。所以我们必须使用 IO 。一旦你使用 IO 生成随机数,任何依赖于该随机数的东西也必须在 IO.

人们会很快开始解释 monads 的理论等等,这是好东西,我只是建议耐心地接近它,在深入理论方面之前习惯这些模式。