给出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=...
例子反驳功能纯度.
从概念上讲,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 - 它们是两个独立的东西,两者都可以存在而没有另一个.