参考透明度这个术语是什么意思?我听说它被描述为"它意味着你可以用平等替换等于",但这似乎是一个不充分的解释.
theory computer-science functional-programming referential-transparency
我在一本书中读到这一行:
实际上,构建一个能够实际确定C++函数是否会改变特定变量值的编译器是不可能的.
该段讨论了在检查const-ness时编译器保守的原因.
为什么不可能构建这样的编译器?
编译器总是可以检查是否重新分配了一个变量,是否正在调用一个非const函数,或者它是否作为非const参数传入...
在功能编程方面触及Monads之后,该功能是否实际上使语言变得纯粹,或者它是否只是另一个"从监狱免费卡中获取"来推理现实世界中的计算机系统,在黑板数学之外?
编辑:
这不是有人在这篇文章中所说过的火焰诱饵,而是一个真正的问题,我希望有人可以用枪击我说,证明,这是纯粹的.
此外,我正在研究关于其他不那么纯粹的功能语言和一些使用良好设计和比较纯度的OO语言的问题.到目前为止,在我非常有限的FP世界中,我仍然没有理解Monads的纯度,你会很高兴地知道我喜欢不变性的想法,这在纯度赌注中更为重要.
monads haskell functional-programming referential-transparency
换句话说,是什么让一种语言变得纯洁?
例如,Smalltalk被认为是纯粹的面向对象语言.可以说Haskell和Lisp是纯函数式语言.
当我们说纯粹时,这是否意味着他们不具备其他编程范式(这远非事实),还是意味着它们被设计用于那种"纯粹的"X范式?
我一直试图将功能编程包围一段时间?我已经查找了lambda演算,LISP,OCML,F#甚至组合逻辑,但我遇到的主要问题是你如何做需要副作用的事情(与用户交互,与远程服务通信,甚至处理模拟使用)随机抽样)不违反纯函数式编程的基本前提,即对于给定的输入,输出是确定性的?我希望我有意义,如果不是,我欢迎任何正确教育我的尝试.提前致谢.
我刚刚开始看看Haskell(我之前的FP体验是在Scheme中),我遇到了这段代码:
do { putStrLn "ABCDE" ; putStrLn "12345" }
Run Code Online (Sandbox Code Playgroud)
对我来说,这是程序式编程,如果有的话 - 特别是因为副作用的连续性.
有人请说明这段代码在任何方面都是"功能性的"吗?
我正在阅读 Scala 编程这本书,据说:
...在这种情况下,它的副作用是打印到标准输出流。
我没有看到副作用在哪里,因为对于相同的输入, println 将打印相同的输出(我认为)
UPDATE
例如,每当我们调用:
println(5)
Run Code Online (Sandbox Code Playgroud)
它将打印5,我没有看到调用println(5)会打印 5 以外的值的情况!
我理解功能编程本身的不同概念:副作用,不变性,纯函数,参考透明度.但我无法将它们连接在一起.例如,我有以下问题:
ref之间的关系是什么?透明度和不变性.有人暗示另一个吗?
有时副作用和不变性可互换使用.这是对的吗?
据我所知,不纯函数是那些在使用相同参数调用时并不总是返回相同值的函数(我必须丢失一些东西,或者可能是错误的,如果我正确的话,请纠正我).
那么为什么被printf()认为是不纯的功能呢?
给出Haskell 值(根据Rein Heinrich的评论编辑)f:
f :: IO Int
f = ... -- ignoring its implementation
Run Code Online (Sandbox Code Playgroud)
引用"Idris的类型驱动开发"
纯函数的关键属性是相同的输入总是产生相同的结果.此属性称为参照透明度
是f,和,即IO ...Haskell中的所有函数,纯粹?在我看来,从那以后,它们lookInDatabase :: IO DBThing不会总是返回相同的值,因为:
return MyDbThing导致结果总之,是f(和IO ...一般的功能)纯粹?如果是,那么请纠正我的错误理解,因为我试图f用我的t=...例子反驳功能纯度.
我的问题是haskell中的monad是否真的保持了hakell的纯度,如果是的话.我经常读到副作用是如何不纯的,但有用的程序(例如i/o)需要副作用.在下一句中,声明haskell的解决方案是monads.然后monad在某种程度上被解释,但实际上并不是他们如何解决副作用问题.
我已经看到了这个和这个,我对答案的解释实际上就是我自己读到的那个 - IO monad的"动作"不是i/o本身,而是执行时执行的对象/ O.但是我发现可以为任何代码或任何已编译的可执行文件创建相同的参数.难道你不能说C++程序只在编译代码执行时产生副作用吗?所有的C++都在IO monad中,所以C++是纯粹的?我怀疑这是真的,但我老实说不知道它不是以什么方式存在.事实上,Moggi(sp?)最初是否使用monads来模拟命令式程序的指称语义?
一些背景:我是haskell和函数式编程的粉丝,我希望随着我的学习继续学习更多.例如,我理解参考透明度的好处.这个问题的动机是我是一名研究生,我将为编程语言课提供2个1小时的演示文稿,其中一个特别涉及haskell,另一个涉及函数式编程.我怀疑大多数班级不熟悉函数式编程,可能已经看过一些方案.我希望能够(合理地)清楚地解释monad如何解决纯度问题而不进入类别理论和monad的理论基础,我没有时间去讨论,无论如何我不完全了解自己 - 当然还不够好.
我想知道在这种情况下"纯度"是不是真的很明确?