【问题标题】:IO implementation inside HaskellHaskell 内部的 IO 实现
【发布时间】:2012-05-13 22:39:29
【问题描述】:

事实上,我知道我们不能独立实现 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 semantics


【解决方案1】:

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

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

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

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


作为参考,请参阅博士论文"A Functional Specification of Effects",Wouter Swierstra,它概述了在 Haskell 中编码 IO 和其他效果的各种方式,并将 IO 规范定义为纯函数数据类型(一种您所做工作的延伸)。

【讨论】:

  • 感谢回复和参考!我是这个网站的新手,所以如果我稍后在这个主题中提出一些问题,会有人注意到吗?还是创建一个新主题会更好?
  • 对了,我的问题是在看完这篇教程haskell.org/haskellwiki/IO_inside和这篇论文webcache.googleusercontent.com/…之后出现的
  • 这里使用了定义为RealWorld->(a,RealWorld)的IO类型,所以使用假参数RealWorld来实现一个动作序列。但是恕我直言,如果没有外部编译器黑客,这种模型在纯语言中是不可能的。所以想知道为什么要用这个实现,希望pdf有更清楚的解释。
  • @user1374768:最好问一个新问题。
猜你喜欢
  • 2014-03-30
  • 2011-10-02
  • 1970-01-01
  • 2019-03-28
  • 2019-01-31
  • 2012-06-08
  • 1970-01-01
  • 2020-02-03
  • 2012-03-28
相关资源
最近更新 更多