繁体   English   中英

Haskell 内部的 IO 实现

[英]IO implementation inside Haskell

我知道事实上,我们不能独立实现 IO monad,但我不知道究竟是为什么。 此代码尝试使用函数式语言实现命令式范例。 你能解释一下这个例子和真正的 IO 之间的区别吗? 看起来函数 main 实现了正确的动作顺序并且保持懒惰。

import System.IO.Unsafe   

data Io a = Io a 

runIO :: Io a -> a
runIO (Io a) = a

instance Monad Io where  
 return x = Io x
 Io a >>= f = f a

-- internal side effect function 
output :: Show a => a -> Io () 
output s  = return $! unsafePerformIO $ print s

----------------------------------------------------------------

mainIO :: Io ()                             
mainIO = do output "A"  
            b <- return "B"
            output b     
            output b 
            x <- return (undefined :: String)
            return undefined
            output "C"    
            head [output "C", output "C"]
            output x  
            output "D"

test = runIO mainIO 

输出:

"A"
"B"
"B"
"C"
"C"
<interactive>: Prelude.undefined

我不确定你想展示什么。 您已经在 Haskell 中嵌入了IO编码,使用现有的IO实现作为目标。

关键是您使用了unsafePerformIOprint ---您从其他 IO 系统借用的原语。

考虑一下:如果您没有任何其他 IO 系统可以依赖,该怎么办。 所以没有print或其他方式来调用原始 IO 函数。 你将如何实现 IO?

因此,虽然您可以在 Haskell 中以多种方式实现 IO 抽象,但您总是不得不依赖新的运行时原语函数来实际调用操作系统来执行真正的 IO。 这是 Haskell 本身无法实现的部分。


作为参考,请参阅 Wouter Swierstra 的博士论文“效果的功能规范”,该论文概述了 IO 和其他效果在 Haskell 中的各种编码方式,并将 IO 规范定义为纯函数数据类型(种类你所做的事情的延伸)。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM