如果编译一个不输入的程序会发生什么? (Haskell IO纯度问题(再次))

栏目: 编程语言 · 发布时间: 7年前

内容简介:翻译自:https://stackoverflow.com/questions/8382485/what-happens-if-you-compile-a-program-that-takes-no-input-haskell-io-purity-is

使用任何参数调用putStrLn时,将始终返回IO()类型的值.我同意这是纯粹的,我可以处理.但它是否具有参考透明度?我是这么认为的,因为对于任何给定的输入,你可以用IO()替换函数调用,这将在stdout中抛出正确的字符串.

所以我对putStrLn很酷,但是在没有参数的情况下调用getLine可以返回任意数量的东西,前提是它们的类型为IO String.这既不纯粹也不是引用透明的权利?

愚蠢的迂腐问题,它可能不会改变我编写代码的方式,但我真的想要一劳永逸地解决这个问题. (我知道IO monad会正确排序,这不是我的问题)

这为我提出了另一个问题.编译器是否足够智能以识别不需要输入的程序?比如说我编译

main = putStrLn . show $map (+1) [1..10]

GHC是否足够聪明,可以将该程序减少到IO(),导致[2,3,4,5,6,7,8,9,10,11]被打印出来?或者它仍在运行并在运行时评估/执行所有内容?对于不需要输入的任意程序也是如此. GHC是否采用了这样一个事实:整个程序是透明的,并且可以简单地用它的价值取代?

我想这里有两个问题.

> IO引用是否透明

> GHC会在编译时减少任意表达式

查看IO的类型,您可以想象它依赖于没有数据构造函数的神秘值RealWorld,并通过使每个语句依赖于最后一个(在单个线程世界中)来模拟引用透明性.在IO String的情况下,这是RealWorld的新类型包装器 – > (RealWorld,String)……这是一个函数,而不是一个值.在没有Monad实例的情况下使用IO会使这一点特别且痛苦,显而易见.

Prelude GHC.Types> :info IO
newtype IO a
  = IO (GHC.Prim.State# GHC.Prim.RealWorld
        -> (# GHC.Prim.State# GHC.Prim.RealWorld, a #))

至于GHC的优化,在这种情况下,它不会在编译时将列表减少为字符串. GHC 7.2.1生成的优化代码懒洋洋地生成一个列表,在结果上映射(1),将列表转换为字符串,最后将其打印到控制台.几乎与它在您的示例中读取的完全相同.

翻译自:https://stackoverflow.com/questions/8382485/what-happens-if-you-compile-a-program-that-takes-no-input-haskell-io-purity-is


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming Collective Intelligence

Programming Collective Intelligence

Toby Segaran / O'Reilly Media / 2007-8-26 / USD 39.99

Want to tap the power behind search rankings, product recommendations, social bookmarking, and online matchmaking? This fascinating book demonstrates how you can build Web 2.0 applications to mine the......一起来看看 《Programming Collective Intelligence》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具