2014-11-08 99 views
-1

林學二郎 假設我有兩個列表二郎列表元組匹配

[{a,a,a,b,c},{d,d,a,a,b},{a,b,c,d,e}] 
[{{a,a,a,a,a},10},{{a,a,a,a},6},{{a,a,a},4}] 

彭定康比賽結束後,預期的結果{A,A,A,B,C},因爲它可以匹配{{A,A,一},4}

我試圖列表:keysearch列表:成員,但不能得到預期的結果

什麼建議嗎?

謝謝

+0

「{a,a,a,b,c}」與「{{a,a,a},4}'匹配?你能解釋一下這兩者是怎麼樣的? – mpm 2014-11-08 22:37:42

+0

謝謝你的回覆。我想匹配{a,a,a | _} {a,a,a,b,c}。這可能嗎? – user3644708 2014-11-08 22:45:18

+0

還不確定。爲什麼'{a,a,a,b,c}'不匹配'{{a,a,a,a,a},10}'?元組通常代表某種完整的連接數據;如果您只想使用其中的一部分,也許嘗試將其表示爲列表?對於我來說,如果我真的不明白你想表達什麼,那麼很難想出通用算法。也許試圖描述你的匹配背後的邏輯,你從哪裏獲得輸入,以及你將在哪裏使用你的輸出。這可能對我有所幫助。 – mpm 2014-11-08 23:24:04

回答

2

匹配不消耗。你的心理模型如何匹配工作是令人困惑的設置操作(如設置減法和交集)與比較和分配。您的設置操作的概念也可能從一些評論中受益。

Erlang的匹配是只有賦值和斷言(一種比較)。如果我們反對任何值相匹配的綁定變量(從來沒有使用之前),變量會綁定(分配),其值:

Foo = {a,b,c}. 

現在Foo{a,b,c}可以互換使用。這是像數學類一樣的純符號分配,而不是其他語言中變量是「值的存儲框」的意義上的「變量」。

如果我們使用=運算符對任何值和現在綁定的符號Foo,我們將執行檢查比較(斷言)而不是賦值。 Foo不能意味着比在目前情況下{a,b,c}其他任何東西,所以想給它分配任何不同的值造成了一個例外,而只是指出{a,b,c}{a.b.c}是正確的,仍然產生{a,b,c}(既然Foo現在是一個符號{a,b,c}它可以出現在任何一方,但聲明仍然正確)。

{a,b,c} = {a,b,c}. 

{a,b,c} = Foo. 

Foo = {a,b,c}. 

回報{a,b,c},並沒有引發異常,因爲所有我們在這裏所做的就是斷言{a,b,c}確實{a,b,c}

如果我想分配僅僅是第一價值,我可以搭配另一種方式:

{Bar,_,_} = {a,b,c}. 

現在Bar代表a_值將被忽略(完全跳過)。原{a,b,c}沒有改變。這也是真實的,如果我們這樣做:

{_,Baz,_} = Foo. 

現在Baz代表b,並Foo仍然是{a,b,c}。這就是它。當涉及到列表,像[{a,b,c}, {1,2,3}]我們仍然可以做配套,但由於清單的性質,我們將在一個時間(試試這個解釋器中)檢查了一塊:

Spam = [{a,b,c}, {1,2,3}]. 
[Boo | _] = [{a,b,c}, {1,2,3}]. 

現在Boo代表{a,b,c},和Spam仍然代表其原始列表。

這就是關於所有匹配。關於Erlang模式匹配的神奇之處不在於它是如何工作的,它有多少地方爲模式匹配提供了天然的機會,以及它如何自然地解決了大量需要程序檢查或其他語言中的直接分配操作的問題(cond,功能參數,=,消息接收等)。

設置和列表操作與Erlang中的模式匹配不同。我建議首先閱讀一些基本的學習材料,例如許多優秀的初學者教程和Learn You Some Erlang

+0

謝謝你的回答。隨時編輯問題。 – user3644708 2014-11-11 12:31:37