《Haskell 编程的第一原理》一书中说:
严格来说,Monad 对于 Haskell 来说并不是必需的。尽管 Haskell 的当前标准确实使用 monad 来构建和转换 IO 操作,但 Haskell 的旧实现却没有。Monad 强大且有趣,但它们并不能定义 Haskell。相反,单子是根据 Haskell 定义的。
Haskell 的旧实现如何在不使用 Monad 的情况下构建和转换 IO 操作?
根据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)
归档时间: |
|
查看次数: |
94 次 |
最近记录: |