如何在不使用 Monad 的情况下构建和转换 IO 操作

blu*_*ray 1 haskell

《Haskell 编程的第一原理》一书中说:

严格来说,Monad 对于 Haskell 来说并不是必需的。尽管 Haskell 的当前标准确实使用 monad 来构建和转换 IO 操作,但 Haskell 的旧实现却没有。Monad 强大且有趣,但它们并不能定义 Haskell。相反,单子是根据 Haskell 定义的。

Haskell 的旧实现如何在不使用 Monad 的情况下构建和转换 IO 操作?

Li-*_*Xia 5

根据Haskell 的历史:Lazy with Class(参见第 7 节),两种主要方法是基于流的 IO 和基于连续的 IO。

在基于流的 IO 中,您的main程序是一个函数[Response] -> [Request],运行时系统向其提供一个神奇的惰性输入列表。然后评估输出,看看程序产生了什么请求;进行一些系统调用并将响应输入到输入列表中。您在编写时需要小心main,在输出相应的请求之前,它不会查看其输入。

在基于连续的 IO 中,有一个抽象类型Behaviour(特别是被定义为上述[Response] -> [Request]类型,但重点是它不一定是),并且 IO 原语采用连续来应用于其结果。

Behaviour :: Type

getLine :: (String -> Behaviour) -> Behaviour
putStrLn :: String -> (() -> Behaviour) -> Behaviour  -- or equivalently,  String -> Behaviour -> Behaviour
Run Code Online (Sandbox Code Playgroud)