haskell 如何在不使用单子的情况下构造和转换IO动作

soat7uwm  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(143)

在《Haskell从第一原理开始编程》一书中据说:
严格地说,单子对Haskell不是必需的。尽管Haskell的当前标准确实使用单子来构造和转换IO操作,但Haskell的旧实现却没有。单子功能强大且有趣,但它们并没有定义Haskell。相反,单子是根据Haskell定义的。
Haskell的旧实现是如何在不使用Monad的情况下构造和转换IO操作的?

roejwanj

roejwanj1#

根据A History of Haskell: Being Lazy with Class(参见第7节),两种主要方法是基于流的IO和基于延续的IO。
在基于流的IO中,你的main程序是一个[Response] -> [Request]函数,运行时系统向它提供一个神奇的懒惰输入列表,然后对输出求值,看看程序产生什么请求;在编写main时需要注意,在输出相应的请求之前,它不会查看其输入。
在基于continuation的IO中,有一个抽象类型Behaviour(具体地说,它被定义为上面的[Response] -> [Request]类型,但重点是它不一定是),IO基元需要一个continuation来应用于它们的结果。

Behaviour :: Type

getLine :: (String -> Behaviour) -> Behaviour
putStrLn :: String -> (() -> Behaviour) -> Behaviour  -- or equivalently,  String -> Behaviour -> Behaviour

相关问题