2009-10-15 122 views
3

我無法理解這條線。需要幫助理解這個erlang代碼

[Pid2 ! {delete, V1a} 
    || {Pid1a, V1a} <- PV1a, Pid2 <- P2, Pid1a /= Pid2 
    ], 

這裏是我的理解:雙管之前 什麼「||」根據雙管之後的情況反覆進行。因此帶有刪除原子的消息會重複發送到Pid2。 我知道'/ ='意味着不平等。我不明白'< - '是什麼意思,最終意味着什麼。

+0

將標題改爲「瞭解Erlang中的列表理解」會很好。 – Christian 2009-10-15 06:11:57

回答

15

[something(X) || X <- L],是一個列表理解。 L是一個元素列表,這個表達式創建一個新元素的列表,通過調用something()來形成每個元素。

[something(X,Y) || X <-L, Y<-M]是類似的,但對於在X的每個元素和Y

​​的笛卡兒積將創建一個元件是過濾器表達式。與第一個相同,但僅針對L的元素執行,其中Expr對於給定的X爲真。

[something(X) || {X,..} <-L, Expr]是另一種過濾器。在列表理解中,只有那些可以被元素匹配的元素。

還有一件事要知道的是,這不僅可以用於生成另一個列表,而且還可以爲每個元素執行一個命令。如果列表理解的結果不匹配,編譯器將根本不知道生成列表。此行爲可用於模仿其他語言的foreach

一些例子:

1> [ X*2 || X <- [1,2,3] ]. 
[2,4,6] 
2> [ X*Y || X <- [1,2], Y <- [3,4,5] ]. 
[3,4,5,6,8,10] 
3> [ X*3 || X <- [1,2,3,4], X rem 2 == 0 ]. 
[6,12] 
4> [ X || {a,X} <- [{a,1},{a,2},{b,3},{c,4}] ]. 
[1,2] 

所以,你的代碼生成從P2 PV1a和PID2元素都{Pid1a,V1A}元素的笛卡爾乘積,除了其中Pid1a等於PID2這些元素,併爲每個這些對發送{delete,V1a}消息到Pid2。

5

我不知道Erlang,但這看起來就像我知道的一堆語言的列表解析。希望這個猜測會幫助你,直到有人誰知道二郎可以回答:

[Pid2 ! {delete, V1a} || {Pid1a, V1a} <- PV1a, Pid2 <- P2, Pid1a /= Pid2], 

轉化爲命令式的僞代碼:

For each item in PV1a, unpacking item to {Pid1a, V1a} 
    For each Pid2 in P2 
     If Pid1a /= Pid2 
      Pid2 ! {delete, V1a} 

換句話說,每個PID在PV1a和P2,發送郵件只要Pid1和Pid2不是相同的Pid,就刪除V1a到Pid2。

+0

你能解釋一下拆包的部分嗎?解包是什麼意思? – Quincy 2009-10-15 04:46:10

+0

這裏我們使用模式匹配來首先檢查列表PV1a的元素是兩個元素的元組,並將元組拉開到它的元素Pid1a和V1a。模式匹配是erlang的基礎,在erlang代碼中無處不在。 – rvirding 2009-10-15 10:14:14

1

這是一個list comprehension和< - 運算符用於生成器。

看看LC的更受歡迎的介紹示例;找到三角形,其中整數邊的平方等於整數斜邊的平方,但對於給定的整數範圍Ns

​​

這給了我們以下列表作爲輸出。

[{3,4,5},{4,3,5}] 

這似乎是正確的:

3² + 4² = 5² 
9 + 16 = 25 
25 = 25 

所以列表理解可以理解爲給我們每一個X,Y和C使得X是從Ns個取,Y是從Ns和C線是取自Ns,X 2 + Y 2等於C 2。