我無法理解這條線。需要幫助理解這個erlang代碼
[Pid2 ! {delete, V1a}
|| {Pid1a, V1a} <- PV1a, Pid2 <- P2, Pid1a /= Pid2
],
這裏是我的理解:雙管之前 什麼「||」根據雙管之後的情況反覆進行。因此帶有刪除原子的消息會重複發送到Pid2。 我知道'/ ='意味着不平等。我不明白'< - '是什麼意思,最終意味着什麼。
我無法理解這條線。需要幫助理解這個erlang代碼
[Pid2 ! {delete, V1a}
|| {Pid1a, V1a} <- PV1a, Pid2 <- P2, Pid1a /= Pid2
],
這裏是我的理解:雙管之前 什麼「||」根據雙管之後的情況反覆進行。因此帶有刪除原子的消息會重複發送到Pid2。 我知道'/ ='意味着不平等。我不明白'< - '是什麼意思,最終意味着什麼。
[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。
我不知道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。
這是一個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。
將標題改爲「瞭解Erlang中的列表理解」會很好。 – Christian 2009-10-15 06:11:57