作者godfat (godfat 真常)
看板java
标题purely functional (原 [问题] SCJP6.0)
时间Tue Aug 4 20:32:55 2009
: → qrtt1:建议换个标题续继 :D 08/04 17
原标题:R: [问题] SCJP6.0
: 推 godfat:
http://en.wikipedia.org/wiki/Referential_transparency_(computer_science)
08/04 17
: → sbrhsieh:谢谢提供这项资讯。但 Referential transparency 与 08/04 17
: → sbrhsieh:Schelfaniel 讲的特性似乎不是同一回事? 08/04 17
唔,仔细想想应该贴这页的:
http://en.wikipedia.org/wiki/Purely_functional
referential transparency 是 purely functional 之後的一个特性,
好像确实不能跟原本 immutable object 混为一谈 :s
不好意思没想清楚就丢连结了... 只是一时找不到什麽好 reference
这里:
http://en.wikipedia.org/wiki/Functional_programming#Concepts
说明 purely functional 有四点特性:
1. 如果一个 expression 的 return value 没被用上,则可以从程式中
完全移除,也是就是完全不呼叫。
2. referential transparency. 即 if x == y then f(x) == f(y)
3. 如果任两个 expression 没有相依性,则 expr 顺序可互换,
也可同时执行。这点对於 statement 应也是,如果有 statement 的话
4. 如果这个语言不允许 side-effect 的话,那麽任何 evaluation strategy
都可以任意使用,给 compiler 完全自由选择。
例如要 call by value, call by reference, 或是 call by name 都可
其实我觉得简单地说就是,不能有任何 side-effect,
因此不能有任何 state. 大概就这样,其他都是衍生出来的性质。
这边不会跟 no side-effect 直接连上关系的原因,
我想是有些情况下 side-effect 是可以被允许的。
※ 引述《Schelfaniel (Schelfaniel)》之铭言:
: 可是 Java 还是走 OO,所以写 Clojure 时,会有一半以上,
: 实际上是会带 OO 感觉的函式语言,这有点没办法,
: 因为物件是会变的,
: (let [java-object ...]
: (process1 java-object)
: (process2 java-object))
: 像这样在纯函式语言,应该要可以保证 执行 process2 时的 java-object,
: 和执行 process1 时的一样,但是,它既然是 java-object,
: 在 process1 里面就可以进行内容修改如 .setXXXX 之类的,
: 这种就让 Clojure 没办法那麽纯了。
例如以上面的例子而言,如果 process1 和 process2 都不会动到
java-object 本身的 state, 也不会动到任何共享的 state,
则 process1 和 process2 可以在有 side-effect 之下,
却仍然保有上述的 2, 3 点性质。
==
其实我也没有很熟,看图说故事,讲错还望请指正,谢谢 :)
不过好像又跟 java 没关系了... XD
--
#!/usr/bin/env ruby [露比] /Programming (Kn|N)ight/ 看板《Ruby》
# if a
dog nailed
extra legs that
http://webptt.com/cn.aspx?n=bbs/Ruby/index.html
#
walks like an octopus, and Welcome ~
Ruby@ptt~
#
talks like an octopus, then
◢█◣ http://www.ruby-lang.org/
# we are happy to treat it as
█ http://www.ruby-doc.org/
# if it were
an octopus.
◥ ◤ http://www.rubyforge.org/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18