Erlang程式設計與問題解決/初嘗滋味

维基教科书,自由的教学读本
跳到导航 跳到搜索


二個例子[编辑]

之前提到, Erlang 是函數式程式語言。所謂函數式程式語言,是指語言中的物項都以函數為主要思考方式。1 先看第一個函數, square/1 ,2 求一個整數的平方值。

square(N) -> N * N.

用這個函數,執行 square(3) 會得到 9 。而執行 square(1.2) 會得到 1.44 。 square/1 函數對全部可能的輸入數值,都做一樣的動作:參數與自己相乘。這個函數的規則只有一條。

有時,函數要有二條規則。 Erlang 語言的寫法,對每一條函數規則,都寫一行對應的描述。讓我們看看 sum/1 函數,它接收一列數字,就會把全部數字加總得到總和。

sum([]) -> 0;
sum([Num|Ns]) -> Num + sum(Ns).

二條規則分別依據不同的參數情況,做不同的處置。須注意二條規則之間有分號分隔,並最後以句號結束。應用函數時,將呼叫的函數與參數向二條規則依序由上到下比對,找到符合的情況就使該條規則生效。另外,可注意第二條規則是遞迴規則,而第一條規則是遞迴的底。

『OK! 好像看得懂,不過,程式到底怎麼寫,怎麼執行啊?』讀者的心中可能會出現這樣的疑問。

我把場面拉到具體層面,讓我們往下看。

Erlang 執行環境的安裝與設定[编辑]

要執行上述程式,要按照下列步驟進行:

  1. 下載並安裝 Erlang 平台,
  2. 用文字編輯器撰寫 Erlang 程式,
  3. 用 Erlang 執行環境載入 Erlang 程式、執行、然後閱讀結果。

安裝 Erlang 平台[编辑]

2010 年 9 月 15 日, Erlang 平台已經釋出到 R14B 版本(R17B)。 (到網站下載) 一套 Erlang 平台包含一份編譯器、一份直譯器、一組 Erlang/OTP 程式庫、 CORBA 、以及內部伺服器通訊協定等等。網站提供 Windows 或 Linux 二進位安裝檔可方便安裝,並且自動建立系統參考路徑。

或者,可以下載源碼自行編譯。這樣,相關軟體套件要找齊,並且安裝後要設定參考路徑。資訊請讀讀說明書。

寫程式[编辑]

如下圖,將上述二則函數寫上去,檔案開頭加上二行,一行是模組設定,一行是匯出設定。圖中所示是使用 NTEmacs 編輯器外掛 Erlang 模組,做為程式編輯工具。

Erlang-edit.gif

執行程式[编辑]

如圖,開啟視窗介面的 Erlang 命令列,切換到目的資料夾,編譯程式,然後呼叫二則函數。 Erlang 命令列會以可見的方式列出函數的解。

Erlang-run.gif

其他例子[编辑]

稍微看過 Erlang 如何運作之後,在後面的章節,本書即將告訴你,如何實現我們經常聽到的演算法:例如,快速排序法......

quick_sort([]) -> [];
quick_sort([X|Xs]) ->
    quick_sort([ Y || Y <- Xs, Y =< X ]) ++ [X] ++ quick_sort([ Z || Z <- Xs, Z > X ]).

有趣的資料結構與處理:例如,樹的走訪......

preorder(nil) -> [];
preorder({R, Lt, Rt}) -> [R] ++ preorder(Lt) ++ preorder(Rt).

著名問題的解決:例如,八皇后問題......

solve() ->
    RNums = lists:seq(1,8),
    Permu = permu(RNums),
    Results = lists:filter(fun no_attack_diagonal/1, Permu),
    show(Results).

過程隨時運用 Erlang 的程式技巧及程式庫,包含在記憶體中管理鍵值配對、儲存檔案、跨行程或網路通訊、以及圖型介面控制等等。你會發現 Erlang 是個美妙的語言,因為以上所提到這些蠻有深度或蠻需要技術力、才堪虞實作的項目,在 Erlang 非常容易學會,並且幾乎都只用 Erlang 就可以搞定。

註解[编辑]

  1. 函數式程式語言的思考方式以函數為主,這是什麼意思呢?拿其他二種常聽見的用語來比較,程序式和物件導向,應該可以略知端倪。
    • 程序式:也稱為命令式,程式的每一行或每一個段落都是一組程序、流程。
    • 物件導向:程式中存在許多細項單元,每一項都視為物件。物件中的屬性,也是物件。
    • 函數式:程式中存在的單元,大部份是函數。對於函數,我們會塞給它一些參數,以計算結果。函數的參數,也可以是函數。
  2. 我們對函數的一般表示法是「函數名稱 / 參數數目」。 Erlang 藉由這一組符號識別函數是否相同。