我最近选择了Haskell,语法对我来说真的很混乱。我试图使用
获得0到51之间的随机数randomRIO (0, 51)
但我不知道如何使它成为一个实际的Int(现在它的类型IO a)。 我相信你应该能做到:
gen <- randomRIO (0, 51)
然后gen应该是一个Int,但我必须在do块中这样做?如何创建获取此函数并返回Int的函数。 从googeling我害怕有一些我不理解的基本知识。 我完全迷失了。
答案 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的理论及其所有这些,并且它是好东西,我只是建议耐心地接近它,在进入理论方面之前习惯这些模式。