Erlang學習筆記二

2021-10-17 12:06:07 字數 4840 閱讀 2405

函式的過載

-module(geometry).

-export([area/1]).

area() -> width * height;

area() -> side * side.

通過傳輸元組的方式,可以實現方法的過載,會根據模式匹配自己尋找合適的匹配方法體。被export宣告的方法就是公有方法,而未被宣告的就變成私有方法。

shell的操作

pwd() 檢視當前路徑·

ls() 檢視當前路徑下的檔案

cd(dir) 跳轉路徑到dir路徑下

測試模組

-module(geometry1).

-export([test/0,area/1]).

test() ->

12 = area(),

25 = area(),

ok.area() -> width * height;

area() -> side * side.

通過使用斷言式的測試模組,可以確定函式是否會符和自己心意的執行。

何時使用何種標點符號

當並列列舉時候分號,當表示順序執行逗號,當完成乙個語句時候句號

尾遞迴優化

sum(1) ->     1; 

sum(n) ->     n + sum(n - 1).

理論上說放在最後遞迴會被優化,但是假如最後一句不止呼叫方法,會被優化嗎?

很遺憾並不會,可以注意到在進行遞迴時候,n的值將會被儲存,用於當後面計算完之後相加,當列數值趨於無限大時候,需要儲存的值也是無窮大的。這時候需要對進行優化:

tail_sum(n) ->     tail_sum(n, 1). 

tail_sum(1, result) ->     result;

tail_sum(n, result) ->     tail_sum(n - 1, n + result).

快樂列舉

-module(shop).

-export([cost/1]).

cost(oranges)   -> 5;

cost(news*****) -> 8;

cost(pears)     -> 9;

cost(milk)      -> 7.

在這個例子中,通過shop:cost(typename)的方式去訪問列舉,然後會返回每個列舉對應的值。

而基於這個列舉,可以試試之前的列表清單:

total([|t]) ->

shop:cost(what) * n + total(t);

total() -> 0.

通過這樣,我們就可以計算乙個購物清單總共多少錢。

fun函式

test() ->

temp = fun() -> ;

() ->

end,

temp().

通過賦值給常量,可以把函式當作變數來互相傳遞使用

列表函式

temp = fun(x) -> (x rem 2) =:= 0

end,

lists:map(temp,[5,4,66,43]).//[false,true,true,false]

lists:filter(temp,[5,4,66,43]).//[4,66]

通過使用map和filter可以使用自定義函式對列表進行操作

生成函式的函式

temp = fun(x) -> (fun(key) -> lists:member(key,x) end)

end,

go = temp([3,5,6,7]),

go(9).//false

通過temp生成器,生產了乙個go的篩選器,輸入9之後就可以判斷出結果

自定義控制語句

for(max,max,f) -> [f(max)];

for(i,max,f) -> [f(i)|for(i+1,max,f)].

test() ->

for(1,10,fun(x) -> x*x end).//[1,4,9,16,25,36,49,64,81,100]

列表推導

key = [,,,,],

[||<-key].//列表推導

//[,,,,]

使用列表推導可以簡化進行列表的處理操作

快速排序的實現

easysort() ->

;easysort([key|t]) ->

easysort([x||x<-t,x=key]).

使用列表推導可以寫出簡潔的排序實現

回文數字檢索

getsu()->

scope = lists:seq(0,9),

[a*10000+b*1000+c*100+d*10+e||

a <- scope,b <- scope,

c <- scope,d <- scope,

e <- scope,a=:=e,b=:=d,

a/=0].

很有趣的是,你可以使用列表推導來實現一些很複雜的邏輯判斷,而看起來就像你在寫sql語句似的。

++操作符和--操作符

使用++操作符進行陣列拼接,使用--操作符來取出資料

實現全部順序可能

perms()->

;perms(t)->

[[head|tail]||head <- t,tail <- perms(t--[head])].

>perms("123").//["123","132","213","231","312","321"]

該演算法實現的是隨機排列,可以將輸入的內容所有組合方式列舉出來

內建函式

list_to_tuple([xx,yy,zz]) //

time() //獲得當前時間

關卡的使用

test() ->

towhen(5).

towhen(x) when x > 0,x /= 1 -> x;

towhen(x) -> -x.

towhen將輸入的數值變為正數,並且假如遇到1會輸出-1.這裡列舉出了關卡如何寫以及多判斷情況,逗號是and分號是or

關卡中的分號 or orelse

需要注意分號等同於orelse,其是短路式的,當前面正確就會跳過後者。or則會計算左右兩邊的值再進行或者。同理的還有逗號與andalso

true關卡的使用

作為乙個來著不拒的關卡,可以負責接受其他關卡不要的東西。

關卡判斷函式

is_atom(x) 是原子

is_binary(x) 是二進位制型

is_constant(x) 是常量

is_float(x) 是浮點

is_function(x) 是fun

is_function(x,n) 是帶有n個引數的fun

is_integer(x) 是整數

is_list(x) 是列表

is_map(x) 是對映組

is_number(x) 是整數或浮點數

is_pid(x) 是程序識別符號

is_pmod(x) 是引數化模組的例項

is_port(x) 是埠

is_reference(x) 是引用

is_tuple(x) 是元組

is_record(x,tag) 是型別為tag的記錄

is_record(x,tag,n) 是型別為tag大小為n的記錄

abs(x) 絕對值

byte_size(x) x的位元組數,x為位串或者二進位制

element(n,x) x中第n個元素的值

float(x) 將x轉換為浮點值

hd(x) 列表x的列表頭

tl(x) 列表x的尾部

length(x) 列表x的長度

node() 當前的節點

node(x) 建立x的節點,x為程序、識別符號、引用或埠

round(x) 將x轉換為整數

self() 當前程序的識別符號

size(x) x的大小,x為元組或二進位制型

trunc(x) 將x去掉小數取整

tuple_size(x) 元組x的大小

case的應用

key = ,

case key of

when age<0 -> "error age";

when age<16 -> "no";

when age>0 -> "no tang";

when age>16 -> "yes"

end.

可以看到這是乙個case,前面的引數是匹配,而如果有需要可以在匹配的基礎上對裡面值進行關卡判斷。

if的應用

if

a>0 -> ...

a<0 -> ...

true -> ...

end.

無論如何都應該有乙個true,否則會報錯,此外case也要注意如果沒匹配中也會報錯

反轉列表

使用lists:reverse來對列表進行翻轉操作,避免使用++和--符號來進行拼接,因為這會非常低效率

歸集器當希望返回兩個或以上結果的時候,可以用列表來儲存,在取出來的時候進行模式匹配即可。此外假如是對同個陣列多次操作的,可以善用case和if對陣列進行分別處理,避免重複遍歷。

Erlang學習筆記(二)

今天在練習map對映組的時候 本人erlang版本17.01 根據 erlang程式設計 第二版這本書上操作,在取值的時候發現問題,如下 書中操作 如下圖 明顯兩個程式執行不一樣,後來看到官方文件,才發現是這個樣子 在上圖中明確指出,在map對映組中取值的時候用 取值,後來又看了看兩者區別發現兩者只...

Erlang學習筆記(二)

erlang的併發特性源自語言本身而並非作業系統。它把現實世界模擬成一系列的程序,其間僅靠交換訊息進行互動,因此erlang簡化了並行程式設計。在erlang世界中,存在並行程序但是沒有鎖,沒有同步方法,也不存在記憶體汙染的可能,因為erlang根本沒有共享記憶體.erlang程式可以由幾百萬個超級...

Erlang 學習筆記(二)

erlang 學習筆記 二 guibin.beijing gmail.com size medium 1.5 erlang的資料型別 size b u 變數 variables u b 從 url 927861 erlang 學習筆記 一 url 中的 中的double函式定義發現,其引數為x,而且...