我已经将IO monad描述为状态monad,状态是"现实世界".这种IO方法的支持者认为,这使IO操作变得纯粹,就像在引用透明时一样.这是为什么?从我的角度来看,IO monad中的代码似乎有很多可观察到的副作用.此外,是不是可以描述几乎任何非纯函数,如现实世界的功能?例如,我们不能想到,比方说,C的malloc是一个函数,它接受一个RealWorld和一个Int并返回一个指针和一个RealWorld,就像在Realmonorld隐含的IO monad中一样?
注意:我知道monad是什么以及它是如何使用的.请不要回复随机monad教程的链接,除非它专门解答我的问题.
我迷失在这个概念中.这是我的代码,它的作用就是询问你的名字是什么.
askName = do
name <- getLine
return ()
main :: IO ()
main = do
putStrLn "Greetings once again. What is your name?"
askName
Run Code Online (Sandbox Code Playgroud)
但是,如何在我main的askName中获取变量名称?
这是我的第二次尝试:
askUserName = do
putStrLn "Hello, what's your name?"
name <- getLine
return name
sayHelloUser name = do
putStrLn ("Hey " ++ name ++ ", you rock!")
main = do
askUserName >>= sayHelloUser
Run Code Online (Sandbox Code Playgroud)
我现在可以name以回调方式重新使用,但是如果在main中我想再次调用name,我该怎么做?(name <- getLine 显然避免放入主体)