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差不多。
沒有留言:
張貼留言