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 的理论等等,这是好东西,我只是建议耐心地接近它,在深入理论方面之前习惯这些模式。
我最近学习了 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 的理论等等,这是好东西,我只是建议耐心地接近它,在深入理论方面之前习惯这些模式。