erlang列表速構

2021-08-10 06:58:32 字數 2238 閱讀 8161

速構是一種用於描述作用於集合或元素序列(如列表)上的運算的緊促記法。比如數學中的便是乙個例子。「所有屬於自然數集合(由n表示)且大於零的x值"----也就是所有正整數.

1.列表速構記法

erlang是一門語言不是數學。我們可以在語法中融入相同的思想,但必須更加具體。尤其是,元素的順序和選用的資料結構都顯得更為重要。erlang中用於表示元素序列的首選資料結構自然是列表,所以才有列表速構。語法也要稍作修飾。假設你有乙個現在的整數列表,正負整數都有,通過以下方法你可以便捷地從中建立出乙個僅含正整數的新列表(它們在列表中的順序仍然保留):

[x|| x <- listofintegers, x>0]

注意此處必須使用雙豎線||,因為單豎線已經被用在普通列表單元上了,除此之外,我們仍然使用[...]來表示列表。由於鍵盤上沒有

?,我們在用左箭頭<-來表示生成器;||右側除生成器以外的部分便是約束條件,如x>0.模板部分可以是作意表示式,並可以使用繫結於豎線右側或列表速構之外的作意變數(前者如由生成器繫結的變數x).

另外,如果速構中指定多個生成器,便會像寫巢狀迴圈一樣產生元素的各種組合。這種用法的用處不多,但有時也能用上。

2.對映,過濾和模式匹配

單個列表速構可以用於完成各種對映和過濾運算的組合,基中對映是指針對元素完成一些遠算後再將運算結果放入結果列表。例如,以下的列表速構能夠從源列表中選出所有的正偶數(rem表示求餘)並求出它們的平方:

[math:pow(x,2) || x<- listofintegers,x>0,x rem 2 ==0]

但列表速構最強大的能力還是源自模式匹配。在生成器中,<-箭頭左側不一定是變數-----可以是任意模式,跟匹配運算子(=)差不多。這意味著生成器本身就內建了乙個約束條件:只有與模式相匹配的元素才在考慮範圍內;其餘元素統統忽略不計。此外,借助模式你還可以抽取出元素的不同組成部分並將之用在約束條件或模板中。假設你有乙個以元組為元素的列表。你可以從中選出那些面積不小於10的矩形,並建立乙個與之相對誚的面積列表:

[ || <- shapes, h*w >= 10]

使用列表時,可以盡可能的使用列表速構。除了效率因素外,它也是這類運算最緊促和可讀的表達形式。

**:《erlangotp併發程式設計實踐》

關於列表速構,下邊我寫乙個我自已作的函式,用這個函式可以生成乙個自然數列表。使用這種形式的方法來生成列表,一定會很方便,下邊是正文:

-module(makelist)

%%-compile(export_all).

-export([

creatlist/1,

creatlistrange/2

]).

%%這裡用到了乙個反轉列表lists:reverse([1, 2, 3, 4]).

creatlist(maxnumber) ->lists:reverse(listcreat(maxnumber)).

listcreat(n) when

n > 0

-> [n|listcreat(n-1)];

listcreat(0) -> .

%%從乙個數from到數to的自然數列表

creatlistrange(from,to) -> [from+x || x

<- creatlist(to - from)].

好了,上邊是這個模組,下邊是我進行測試時生成的自然數列表:

eshell v6.1

(game@woodcols-imac)1> makelist:creatlist(5).

[1,2,3,4,5]

(game@woodcols-imac)2> 

makelist:creatlistrange(10, 15).

[11,12,13,14,15]

(game@woodcols-imac)

3> 

之所以要用這個列表,是因為,我想建立一組程序,程序要起乙個作為標記的名字,而這個名字要有一定的規律。當我有了自然數列表之後,我可以再使用gen_sup的otp框架中的

start_child/2函式來建立一組

******_one_for_one型別的程序,再使用ets表,將這些程序pid和我的這個列表中的元素對應儲存起來。之後我要取

******_one_for_one

的不管那個程序,我就可以自由處理了。

建立程序的時候,我只要呼叫下邊這個函式就可以了。他用使用列表中的所有資料作為引數,然後傳遞給pred函式。

lists:all

(pred, list) -> boolean()

erlang列表逆序和拼接

erlang也學了有一陣子了,環境也配置了.平常只是把書上的例子敲到電腦上去執行.也去看了一下ejabberd的 覺得還是要自己去寫一些 才可以實際掌握語言的程式設計理念,畢竟這是一門函式式程式語言.不同於一般其它的命令式程式設計.先從它的基本資料型別列表的處理開始吧.程式實現了列表的逆序,列表的連...

Erlang 十一 列表推導

使用特定的列 式來處理列表 f x x l f x x l x 0 l待處理的列表 x列表中的乙個元素 f對x的處理函式 x 0是否處理列表元素的判斷。如果x小於等於0,跳過處理 已知列表 1,2,3,4,5 得到每個元素乘以2後的新列表 純數字組成的陣列 list 1,2,3,4,5 1,2,3,...

Erlang 十二 列表推導 實現對列表的排序

將乙個數字列表由小到大進行排序 list.erl module list export sortnum 1 對純數字列表排序 從小到大 num 當前的數字,列表中第乙個數字 list 取出第乙個數字後,其餘的列表 sortnum num list 通過列表推導,找到比當前數字小的數字列表 sortn...