Re: purely functional (原 [問題] SCJP6.0)

看板java作者 (sbr)時間16年前 (2009/08/04 23:02), 編輯推噓1(102)
留言3則, 1人參與, 最新討論串3/6 (看更多)
※ 引述《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)

08/05 11:27, , 1F
Common Lisp 是原本就有 (make-lisp-stream)
08/05 11:27, 1F

08/05 11:30, , 2F
而 clojure 是直接用 Java 的 Stream :QQ
08/05 11:30, 2F

08/05 11:32, , 3F
所以要找 Haskell 的達人 如 g????t 來解答較好 :Q
08/05 11:32, 3F
文章代碼(AID): #1AU4sMNb (java)
討論串 (同標題文章)
文章代碼(AID): #1AU4sMNb (java)