我可能不太了解IO monad.
如果我编写一个预计运行数月的应用程序,同时记录其进度,那么IO monad会将所有日志信息保存在RAM中直到结束吗?
在IO Inside的博客中,Haskell将世界塑造为
main :: RealWorld -> ((), RealWorld)
Run Code Online (Sandbox Code Playgroud)
这样在执行代码的Haskell部分期间不会发生IO,但只有在应用程序返回时才会发生main.
我可能完全误解了这一点.有人能解释时哈斯克尔实际上做IO?
IO monad会将所有日志信息保存在RAM中直到结束吗?
不,您不应该将"IO monad"视为执行操作的内容.它只是表示命令式程序的数学方式.原始的命令式程序是这样的getChar; >>=用于将两个程序粘合在一起形成一个更大的命令式程序.IO monad是所有命令式程序的集合.
考虑诸如的程序
main = putStr "Hello, " >> putStrLn "world!"
Run Code Online (Sandbox Code Playgroud)
这意味着:main是一个执行程序的程序putStr "Hello, ",完成后,执行程序putStrLn "world!".除了指令指针之外,Haskell解释器或编译程序不需要将任何状态保存在内存中,即"我们在哪里,以及我们接下来要执行什么".
这个RealWorld -> ((), RealWorld)比喻可能让你困惑,因为它似乎意味着将外部世界的状态转变为一个必须全部计算的新状态,之后可以更新世界以反映计算的状态.这根本不是什么.Haskell维基警告这个:
关于IO的以下故事是不正确的,因为它无法实际解释IO的一些重要方面(包括交互和并发).