当前位置:  开发笔记 > 编程语言 > 正文

通过IO了解Haskell中的纯函数

如何解决《通过IO了解Haskell中的纯函数》经验,为你挑选了1个好方法。

给出Haskell (根据Rein Heinrich的评论编辑)f:

f :: IO Int
f = ... -- ignoring its implementation

引用"Idris的类型驱动开发"

纯函数的关键属性是相同的输入总是产生相同的结果.此属性称为参照透明度

f,和,即IO ...Haskell中的所有函数,纯粹?在我看来,从那以后,它们lookInDatabase :: IO DBThing不会总是返回相同的值,因为:

在t = 0时,DB可能会关闭

在t = 1时,DB可能会启动并return MyDbThing导致结果

总之,是f(和IO ...一般的功能)纯粹?如果是,那么请纠正我的错误理解,因为我试图f用我的t=...例子反驳功能纯度.



1> Erik Kaplun..:

从概念上讲,IO实际上是一种单独的语言.它是Haskell RTS(运行时系统)的语言.它在Haskell中实现为(相对简单的)嵌入式DSL,其"脚本"具有该类型IO a.

因此返回类型值的Haskell函数IO a实际上不是在运行时执行的函数 - 执行的是IO a值本身.所以这些函数实际上纯粹的,但它们的返回值代表非纯计算.

从语言设计的角度来看,IO是一个非常优雅的黑客,可以将非纯粹的丑陋完全隔离开,同时将其紧密地融入其纯净的环境中,而不需要使用特殊的外壳.换句话说,该设计并不能解决由不纯IO引起的问题,但它至少不会影响代码的纯部分.


下一步是研究FRP - 使用FRP,您可以使包含IO的层更薄,并将更多非纯逻辑移动到纯逻辑中.

您可能还想阅读John Backus关于函数编程主题的着作,Von Neumann架构的局限性等.如果您对纯度和IO之间的关系感兴趣,Conal Elliott也是谷歌的名字.


PS也值得注意的是,虽然IO严重依赖monad来解决懒惰评估的问题,并且因为monad是构建嵌入式DSL的一种非常好的方式(其中IO只是一个例子),monad更加通用比IO,所以尽量不要在相同的上下文中考虑IO和monad - 它们是两个独立的东西,两者都可以存在而没有另一个.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有