作者sbrhsieh (sbr)
看板java
标题Re: purely functional (原 [问题] SCJP6.0)
时间Tue Aug 4 23:02:43 2009
※ 引述《godfat (godfat 真常)》之铭言:
: 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 是可以被允许的。
这边的 side-effect 该怎麽定义?涵盖的范围?
我试想过如果一个 FP 语言不允许 function/procedure 有任何的 side-effect,
那麽这个语言写出来的程式会蛮受限的,几乎只能写纯处理数据的工作。
有太多的工作本身就是一种 side-effect,是无法单纯 consume 某些 input,并
以特定 output value 来呈现(resource manage、IO)。比如:
「删除给定路径的某个档案」,这件工作本身就是变更档案系统的状态,这不可能
由一个毫无 side-effect 的 procedure(expression)来实现。
Stream 这种观念/东西感觉上也跟状态很有关系,有玩过比较纯的 FP 语言(诸如
Clojure)的人,可否说明一下该 FP 语言是否有实做 stream 概念的东西?
若有,又是如何去实现管理/操作(manipulation) stream 的 procedure,能够
让这些 procedure 没有 side effect 又有好的效率?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.136.92
※ 编辑: sbrhsieh 来自: 218.173.129.24 (08/05 00:15)
1F:推 Schelfaniel:Common Lisp 是原本就有 (make-lisp-stream) 08/05 11:27
2F:→ Schelfaniel:而 clojure 是直接用 Java 的 Stream :QQ 08/05 11:30
3F:→ Schelfaniel:所以要找 Haskell 的达人 如 g????t 来解答较好 :Q 08/05 11:32