函式的過載
-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,而且...