Haskell中的I/O是否具有功能性?

Meh*_*dad 15 io haskell functional-programming

刚刚开始看看Haskell(我之前的FP体验是在Scheme中),我遇到了这段代码:

do { putStrLn "ABCDE" ; putStrLn "12345" }
Run Code Online (Sandbox Code Playgroud)

对我来说,这是程序式编程,如果有的话 - 特别是因为副作用的连续性.

有人请说明这段代码在任何方面都是"功能性的"吗?

Don*_*art 20

虽然它似乎是一个程序性程序,但上述语法被翻译成一个功能程序,如下所示:

   do { putStrLn "ABCDE" ; putStrLn "12345" }
=>
   IO (\ s -> case (putStrLn "ABCDE" s) of
                  ( new_s, _ ) -> case (putStrLn "12345" new_s) of
                                      ( new_new_s, _) -> ((), new_new_s))
Run Code Online (Sandbox Code Playgroud)

也就是说,一系列嵌套函数具有穿过它们的唯一世界参数,从而"按程序"对原始函数进行排序.此设计支持将命令式编程编码为函数式语言.

这个设计背后的语义决策的最佳介绍是"The Awkward Squad"论文,

在此输入图像描述

  • 作为解释,我对IO的状态monad版本并不感到兴奋,因为这不是实现IO的唯一方法.IO真的是我们抽象的.打开抽象是危险的,因为ghc中IO monad中的内容不是正常的Haskell; 世界令牌必须线性使用. (7认同)
  • 状态monad解释的一个优点是,通过对真实的,更透明的`State`的隐式类比,它更清楚I/O确实表现为monad,而不是简单地说"`IO`是monad,使用它做I/O". (5认同)
  • 请小心.对IO的这种解释是一个持久且误导性的神话.请参阅[我对"函数式编程语言如何工作?"的评论](http://stackoverflow.com/questions/2751313/how-do-functional-programming-languages-work/2754244#2754244). (4认同)
  • 有没有人表明`IO`是monad?或者它只是未经证实的民间传说.由于"IO"无法准确地解释为"状态",因此"状态"的单子性无济于事. (4认同)
  • 对于"什么是IO,并且它是monad"的当前状态,roconnor最近的帖子给出了一个很好的总结,http://r6.ca/blog/20110520T220201Z.html (3认同)
  • @Conal:我认为IO是"只是"一个带有变量替换的代数(以及一个免费的monad),它描述了我们可以让计算机执行的任务,因此它是一个构造的monad(假设生成的语言是完整的)所以所有的价值观,包括FFI,原则上都可以扩展到语言中的术语.问题更多的是"IO代数能否在真实计算机上实现?" 在这种情况下,在我看来,如果没有,高级语言从一开始就注定要失败.IO已经是比大多数AST更简单的代数,所以如果它在这里不能工作...... (2认同)
  • @Conal:这不是一个神话般的便利小说.`State`给出了一个命令式计算模型作为monad,匹配'IO`的*天真概念*; 新手关于"IO"是否"有效"的常见问题通常同样适用于"州"(如果不是更多).我认为,你提出的问题最好被视为[维特根斯坦的阶梯]上的更高级别(http://c2.com/cgi/wiki?WittgensteinsLadder). (2认同)

Con*_*nal 13

我认为我们不能清楚地回答这个问题,因为"功能性"是一个模糊的概念,并且它的含义存在矛盾的想法.因此,我更喜欢Peter Landin建议的替代术语"外延",这是精确和实质性的,对我而言,函数式编程的核心和灵魂,以及它对于等式推理的好处.有关Landin定义的一些提示,请参阅这些注释.IO不是外延.


new*_*cct 5

这样想吧.它实际上并不"执行"IO指令.IO monad是一个纯值,它封装了要执行的"命令式计算"(但实际上并没有执行它).您可以使用monad运算符和类似"do"的结构以纯粹的方式将monad(计算)组合成更大的"计算".尽管如此,本身并没有"执行".实际上,在某种程度上,Haskell程序的整个目的是将一个大的"计算"放在一起,即它的main值(具有类型IO a).当你运行程序时,就是运行这个"计算".