内容简介:翻译自: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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Java 8 习惯用语: 函数纯度
- Xcode 编译疾如风系列(二):并行编译
- 编写 MSBuild 内联编译任务(Task)用于获取当前编译环境下的所有编译目标(Target)
- 使用 Visual Studio 编译时,让错误一开始发生时就停止编译(以便及早排查编译错误节省时间)
- Go编译缓存导致C文件修改后未重新编译
- Android Apk反编译系列教程(一)如何反编译APK
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!