EZTABLE IDEAS 是 EZTABLE 成員揮灑熱情和大家分享專業及創意的網誌。 EZTABLE 讓消費者 24 小時都可以在網路訂位全台灣最優質的餐廳,同時提供餐廳經營者 e 化的訂位管理系統 (雲端、iPad、智慧型手機)

Haskell 簡介

十一月 24 2012 Published by under Engineering

志玲

Haskell 是一個很美、很"純真"的程式語言(像志玲姊姊一樣),如果你認為程式語言不就是那樣,迴圈、if else,換個語法就是個不一樣的語言,那更應該來看看 Haskell 有趣的地方。以下只介紹一些基本的語法、特性,還有更深入的例如 Monad 的元素,那必須等我更熟悉的才能與大家分享 :-p 。

  1. Purity: 剛提到 Haskell 是一個很"純真"的語言,意思是指純函式語言的一個特性: no side-effect ,no side-effect 白話一點來說,就是跟狀態無關,一樣的參數一定會有一樣的結果(Haskell 沒有"變數"),但是一個真實世界的程式是不可能沒有 side effect 的,Haskell 用 monad 來隔離了必要的 IO 等。
  2. Laziness: 只會計算到需要用到的地方,可以很容易地表達無窮的 list
    1. 例如:[x*x | x <- [1..]] 表示了一個 list 其內容是 [1, 2*2, 3*3, 4*4…] 的無窮 list ,因為 laziness 的特性,這樣的資料是可以使用的,因為當在 runtime 操作這個資料過程中,只會計算到所需要的元素,譬如,一個函數是回傳此 list 的第五個與第十個元素的相加,因為 laziness 的特性這陣列只會計算到第十個元素,和一般的 impreative language 表示資料的方式很不一樣。(眼尖的人會發現這 list 很像 python 的 list comprehension ,事實上是 python 向 haskell 借來的語法)
  3. Strong typing: compile 時期就決定型別,有時不必明確指定,compiler 會幫忙 infer 。 strong type 的好處多多,基本上最佳化的效果較好,以及程式會較好維護等。
  4. Curried function: 這也是滿酷的一個特性,在 Haskell 中, function 的宣告是沒有明確指定回傳什麼型別,舉個例子

    add :: Int -> Int -> Int -> Int
    add a b c = a + b + c

    這是一個 function 可以傳入三個數字做加法,Haskell 允許我們只傳入部分的參數,轉成另外一個函數,
    add3 = add 3 ,這樣就造出一個新的函數叫 add3 其型別是 Int -> Int -> Int ,add3 4 5 的結果會等於 3 + 4 + 5 = 12 ,這樣的好處是可以彈性的組合出函數,在 fp 中是很方便的一個特性。
  5. Pattern matching: 讓我們直接看例子

    sum' :: Bool -> Bool
    sum' [] = 0
    sum' (x:xs) = x + sum' xs

    這是一個算 list 總和的函數 sum’ , pattern matching 會在 runtime 的時候作比對,根據參數的不同來選擇函數的定義,可以簡化許多 if else 、提升可讀性等好處。

最後貼上一段我們常見的快速排序法作結尾,

quicksort :: (Ord a) => [a] -> [a]

quicksort [] = []

quicksort (x:xs) = [e | e <- xs, e <= x] ++ [x] ++ [e | e <- xs, e > x]

翻看 Haskell 的歷史就會知道,其實這些厲害的玩意兒早在十幾年前就都被人提出了,甚至更早,常常覺得這世界實在是太高深莫測了,自己永遠都是隻井底之蛙,但是可以勉勵自己的是我們可以永抱著謙虛的態度去學習這一切,在各行各業都是如此。請期待一下下次我想要介紹 Monad 的特性,普遍公認這是學習 Haskell 最難跨越的一步(美麗的志玲,也定有難以捉摸的一面吧),讓我們瞭解一下是怎樣的難跨越,也勉勵自己要繼續學習新事物。

訂閱EZTABLE IDEAS ,持續學習新事物。

Image by http://www.wownews.tw/

Related Posts Plugin for WordPress, Blogger...

No responses yet

發表迴響