2011年6月6日 星期一

從一個簡單的Haskell範例學習如何定義型態

這是我在網路上找到一個小小的範例,可以學習到在Haskell中如何簡單的定義一個型別,希望可以拯救大家的Programming Language作業。

(注意:這篇文章假設你已經裝好了haskell的撰寫環境,如果你還沒準備好,先去找Google大神求救)

更新:修復版範例檔clite.hs

clite_origin.hs 修復範例檔下載位置:http://goo.gl/u5ftU

我們可以從這個範例中學到兩個部分:

  1. 如何定義資料型別(data type)和函式(function)
  2. 如何載入現有的模組(module)

定義資料型別和函式
這個簡單的範例如下:
-- file name: test.hs
1  data Tree a = Leaf a | Branch (Tree a) (Tree a)
2
3  flatten :: Tree a -> [a]
4  flatten (Leaf x) = [x]
5  flatten(Branch x y) = flatten x ++ flatten y


其中line 1定義了Tree的形態,也就是由Leaf或是Branch,都可以代表一個Tree,Leaf的樣子只有一個element,Branch表示分支,所以是由另外兩個Tree來構成,有點類似Linked List樹的概念。

flatten則是代表一個叫做打扁的動作,第一行定義了這個函式的輸入argument是一個Tree,而輸出是一個List,看到這裡其實就猜的到,這個函式的動作其實是要將樹的結構轉換成一個序列,動作是這樣的:遇到Leaf就直接回傳只包含該element的序列,遇到Branch就把兩個子樹換成的序列串接起來(++ 表示串接序列或字串)。

如何載入現有的模組
這段程式碼由於是定義一些東西,大家可以明確的發現這支程式並沒有任何執行的主體,也就是main function,也就是說這整段程式碼執行完將不會顯示任何結果,因為他真的只是定義了一些東西。我們可以把這段程式碼看成一個Tree的模組,當我們載入他以後我們的haskell就可以有Tree的變數型態和一些function。

執行方法如下:
  1. 啟動ghci(GHC interpreter)
  2. 打入:load test.hs(剛剛那個檔案的檔名,前面加":"代表ghci裡面的命令,和vim雷同)
  3. 接下來輸入一個範例試試:flatten (Branch (Branch (Leaf 'a') (Leaf 'b')) (Leaf 'c'))
顯示的結果應該是"abc",為什麼會這樣就請大家回想剛剛的內容囉!
(結束ghci的方式是:q,真的很vim很像吧?)

沒有留言:

張貼留言