Erlang函式學習

2021-06-17 20:03:20 字數 2106 閱讀 1607

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 模組名字 加 即可 模組...