Re: [問題] 大家覺得函數式語言有前途嗎?

作者: xcycl (XOO)   2013-10-30 09:18:36
: haskell 是目前 ML 系語言中,社群整合最好的,cabal 很方便
: 就能下載別人寫好的 lib 來用,但相較於前兩者,要跨過的門
: 檻就高很多,一般的 FPL 都會提供一個用來宣告 side-effect
: 變數的方法,即使是很雜的 Common Lisp 也有區分這兩者,
: haskell 用來提供 side-effect 的做法叫作 monad,這還只是
: 第一個門檻,光這個就可以讓人花上半年一年去搞懂它了,更
: 不必提載下來的兩個 lib 都有 monad 的時候該怎麼辦了。
: 但是當我們想了解 Types 是什麼,PL 又是什麼,又例如該怎
: 麼設計一個 PL 的時候,最容易幫助我們理解並且解決這些問題
: 的通常會是 FPL,你可以 google 書單,就不多講這個了。
這邊有一點要澄清的,Haskell 中談 side-effect 並不等於 impure function,
只有用到 IO monad,Haskell 的程式才有可能是 impure 的。
至於其他的 monad 仍然保證函數的 purity,只是用 monad 的結構方便描述
所謂的 effect,但我們可以抽換所有 monad 換成一般基本的寫法。
假設我們要寫一個抽象的 imperative 語言的直譯器,
將程式用 Haskell 的型別定義,稱為 Program 的話,直譯器函數的型別可寫成
interpreter :: (Program, Memory) -> Memory
或是
interpreter :: Program -> Memory -> Memory
則對任意允許 side-effect 但排除 IO 的程式,
是一個將 "記憶體狀態" 對應到 "記憶體狀態" 的數學函數。
例如賦值可以寫成
interpreteer (x := e) m = write x (eval e m) m
其中 eval e m 計算用現有的狀態 m 來計算 expression e 的值,
write 則回傳更新後的狀態。這邊「狀態」可以用 list 或是函數來代表。
而同樣的函數可以用所謂的 state monad 來改寫,在表達上會更簡潔而已。
有興趣的話,可以提供實際的範例。不過理解 monad 用到一年半載可能有些誇大了,
實際使用上學會用 IO monad 就可以寫些比較實務的程式。

Links booklink

Contact Us: admin [ a t ] ucptt.com