Mel*_*own 3 random io monads haskell functional-programming
我最近选择了Haskell,语法对我来说真的很混乱.我试图使用0到51之间的随机数
randomRIO (0, 51)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使它成为一个实际的Int(现在它的类型IO a).我相信你应该能做到:
gen <- randomRIO (0, 51)
Run Code Online (Sandbox Code Playgroud)
然后gen应该是一个Int,但我必须在do块中这样做?如何创建获取此函数并返回Int的函数.从googeling我害怕有一些我不理解的基本知识.我完全迷失了.
luq*_*qui 16
是的,有一些基本的东西,这是新的Haskellers最常见的事情.基本上,你说的一切都是正确的,如果你想要一个返回随机int的"函数",你就不能拥有它.
你可以做
main :: IO ()
main = do
num <- getRandomR (0, 51)
putStrLn ("The number is " ++ show num)
Run Code Online (Sandbox Code Playgroud)
你也可以把它考虑出来
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)
Run Code Online (Sandbox Code Playgroud)
你不能做的是使它成为一个纯函数/值:
pureCardIndex :: Int
pureCardIndex = ioToPure (getRandomR (0,51)) -- NOT POSSIBLE
Run Code Online (Sandbox Code Playgroud)
因为没有(道德)功能ioToPure.纯函数必须始终返回相同的输出对于相同的输入,而这恰恰不是你想有一个随机数函数做什么.所以我们必须使用IO它.一旦你使用IO随机生成的东西,任何依赖于随机数的东西也必须在IO.
人们将很快开始解释monad理论和所有这些,这是好事,我只是建议耐心地接近它,在进入理论方面之前习惯这些模式.