標籤:

Haskell 不斷的做抽象,有好的運用這些抽象的例子嗎?

初學haskell,函子單子這些概念可以理解。但感覺不知道如何在實際中運用這些抽象。


剛好在看這篇, 拾人牙慧

http://clathomasprime.github.io/hask/freeDecision

提及Functor跟Free, 還用到cata, ana, 都是用在遞歸資料結構

機器學習的決策樹就是種遞歸資料結構, 就可以用了

cata用壓縮機函數摧毀結構, ana用種子函數生成結構, 互為對偶


你去 Codewars 用 Haskell 刷題,先費好大力氣寫出來,再看別人的一行流,你就知道抽象是怎麼回事了(

入口:http://www.codewars.com/r/NeFuGQ


禪宗haskell

學習haskell更多時候並不是學語法學庫而是進行一種哲學思考。所謂禪。

學習haskell時更多的思考方式是是什麼。當python 以 import anti-gravity 翱翔青空時,haskeller 盤坐在地思考何為飛翔、何可謂飛翔。這大概就是飛機與殲星艦的命運岔口。

初見IO定義(newtype IO a = IO (State# RealWorld -&> (# State# RealWorld, a #)) ),鮮有人不為所動。何為IO、何為世界、何為IO之界限、若以人為機器何為IO、人意識的邊界何在、我何以為我、人何以為人、多線程之間之IO、遠程腦部內存共享的雙子。恍惚間彷彿坐在菩提樹下。

Free 與 Cofree 初見並無感。當思考著越來越多是什麼的問題、而不是如何做的問題時,便時常有些閃光似的頓悟。DSL 與 Interpreter 、Rose tree與Tree、Behavior 與 Event,皆為一組Cofree 與 Free。

當js、java之流亦掛FRP於嘴邊時,Haskeller 在思考著何為FRP?FRP根據定義就是以隨時間改變的量為primitive 進行編程。可,何所謂時間?時間僅僅是像庫中所寫的是正實數嗎?時間可數嗎?對於平行宇宙(非線性時間)來說FRP又意味著什麼?於是這時回首讀情態邏輯時態邏輯。突然光著身子從浴缸里跳出來,在紙上寫道、Behavior a = Cofree Next a ; Event a = Free Next a。會當臨絕頂般。所謂時間、不同模型間的差別、也就是Next這個Functor的差別。

抽象、洞悉著世界、時間與我。

學習Haskell、正如放下了鋤頭、仰望著浩渺星河。


parser combinators 算一個例子。一般業務代碼 IO 非常多,高階函數體現不出優勢,而並行情況太複雜,我並不懂,parser 我寫過,也用 clojure 山寨過簡單的 parser combinators。通過函數遞歸調用很有效地控制住了局部變數的共享還有 parser 的復用和組合。函子的概念很常用,在一般函數式代碼中不說函子其實也一直在用。單子並不確定,但是以單子的手法把作為結果的數據封入一份獨立類型的數據當中,繼而進行操作,有點像把一份數據封裝成對象然後從外部間接操作(主要區別是數據不可變需要通過拷貝來完成修改),思路也是蠻常用的。


例如這個SO答案里的例子 scala - When are higher kinded types useful?

首先我們需要一顆二叉樹

data BST a = Tree (BST a) a (BST a) | Leaf

但是如果我們什麼時候需要一顆三叉樹呢? 四叉樹呢?

於是我們做出了一些改動

data Tree f a = Tree (f a) a | Leaf
data Pair a = Pair a a
data Tuple3 = Tuple3 a a a

現在我們可以用 `Tree Pair a` 來表示二叉樹, `Tree Tuple a` 來表示三叉樹, `Tree [] a` 來表示不定叉樹, 甚至 `Tree (Tree f) a`來表示樹套樹了

至於Functor, 你用不用Maybe/Either來做異常處理? 用到的話自然會使用到Functor (和Monad)

至於Monoid, 有沒有想過帶統計線段樹不一定非要儲存數字? 只要是Monoid實例, Set, List等都可以作為區間統計的內容. 以及為什麼區間和統計和區間最大值統計要分開實現? 它們都是R上不同的Monoid罷了.


推薦閱讀:

為什麼程序比較難寫、bug 比較難調呢?
自動安全檢測五大實例
golang channel阻塞與非阻塞用法

TAG:編程 | Haskell |