code

2017年1月21日 星期六

Erlang筆記3 - Functions

module

erlang的module是file scope,所以某個module "geometry"其實就是一個同名的geometry.erl檔案。在此檔案中,可以決定要export什麼functions給其他的module看:


上面area其實是同一個function,但是因為可以接受不同的參數pattern(或說是function head pattern),所以形成了兩個不同head->body pair的clauses。兩者參數的pattern都是arity-1,雖然tuple的長度不一樣。

function的pattern matching採取了類似prolog的clause語法,而不是像scala那樣是一個無關的function name。另外function name是一個atom (或說symbol or constant),所以必須要小寫。

注意pattern matching的順序跟clause宣告順序一至,如果沒有pattern matched,會產生runtime error!


宣告functions 

上面已經可以看到一個function長什麼樣子。另外return value跟其他FP一樣,就是function中最後一個被evaluated expression。

呼叫functions必須加上module name,當然parameters patter也必須match:


如果要寫一個多行的function,則每行用 , 隔開:



lambda / anonymous function

在erlang中,一個function object被稱為 “fun”。

其實funs 比較像是一般程式語言宣告一個function時候的語法和概念,不過他必須用一個variable去bind:



當然可以接受任意參數:

不過由於funs必須要用variable去綁定,但是variables是不能export出去module的,所以註定了funs只能當成某個function的參數或是local anonymous function,甚至不能單獨在一個module中宣告(會compile error),而是必須在某個function中被宣告才行。


first-order functions

lists:map()是一個first order function,因為它能接受funs當作參數:



其他大概都跟Scala或是一般的FP差不多。

沒有留言:

張貼留言