erlang的普通函式和匿名函式fun:
範例1:以下函式列出商品的**。該函式包含5個子句,各個子句之間由分號;分隔。
要在函式所在模組之外使用該函式,應該在-export中匯出改函式。
-module(shop).
-export([cost/1]).
cost(oranges) -> 5;
cost(news*****) -> 8;
cost(pears) -> 9;
cost(milk) -> 7.
範例2:以下函式計算購物清單的商品總**。
-module(shop1).
-export([total/1]).
total([|t]) ->
shop:cost(what)*n + total(t);
total() -> 0.
執行:
2>total(buy).
範例3:同名不同目的函式,以下是兩個不同的函式。
sum(l) -> sum(l,0).
sum(,n) -> n;
sum([h|t],n) ->sum(t,h+n).
fun 匿名函式
fun既可以做函式的引數,也可以做函式(或fun)的結果。
這樣的函式分別叫:以fun為引數的函式,返回fun的函式。
以fun為引數的函式:例:
1>double= fun(x) -> 2 * x end.
2>l = [1,2,3,4].
3>lists:map(double,l). 返回結果:[2,4,6,8]
4>even = fun(x) -> (x rem 2) =:= 0 end. (=:= 是恒等符號)
5>lists:filter(even,l). 返回結果:[2,4]
6>lists:map(even,l). 返回結果:[false,true,false,true]
lists:map(f,l) 將fun f應用到列表l的每個元素上,並返回乙個新的列表。
lists:filter(p,l). 返回乙個新列表,新列表的每個元素由l中每乙個能滿足p(e)為true的元素組成。
像map,filter這樣的函式,在乙個函式呼叫中處理整個列表的操作,使程式變得簡潔易懂。
返回fun的函式:例:
2>maketest = fun(l) -> (fun(x) -> lists:member(x,l) end) end.
3>isfruit = maketest(fruit). 【maketest返回的是乙個函式】
true
5>isfruit(dog).
false
簡單列表處理:
-module(mylists).
-export([sum/1,
map/2]).
%%這兩個是標準庫lists模組中map函式的定義
sum() -> 0;
sum([h|t]) -> h + sum(t).
map(_,) -> ;
map(f,[h|t]) -> [f(h)|map(f,t)].
有了sum和map這兩個函式,就可以對上面的total函式做下改進了:
-module(shop2).
-export([total/1]).
-import(lists,[map/2,sum/1]).
total(l) ->
sum(map(fun()->shop:cost(what)*n end,l)).
erlang 模組中函式學習
在erlang語言的常見幾種資料中,大多重點介紹語法及相關知識,對erlang中的標準庫函式的介紹很少。在程式設計時,總覺得不知道就沒有底,今天就來了解下erlang模組中的函式。erlang模組中的函式裡,有一部分在互動式環境中是可以直接呼叫而不用帶模組名的,但也有的在呼叫時必須帶模組名,這個在e...
erlang學習 為什麼學習erlang
相對於其它語言,erlang的根本性的優勢在於 1 面向併發的支援 它提供的建立大量程序能力,徹底改變了傳統的多執行緒的程式設計模式。在傳統的程式語言中,為了做到高效能,提供併發處理能力,通常是通過多執行緒模型來解決。多執行緒必然會導致加鎖的諸多問題,此外多執行緒程式對程式設計師自身的能力提出了更好...
Erlang 學習小記 erlang 表,
cmd 控制台 輸入 erl 可以進入erl的shell 就可以 使用erlang 語法 進行控制 erl每個語句結束用 結尾 運算算數運算和其他語言基本一樣 在控制台 輸出 1 2加個 再按回車 即可得到輸出結果 模組中如果想要呼叫其他模組 需要在頭部 新增 module 模組名字 加 即可 模組...