2013-07-22 79 views
2

我決定在我的一些代碼中添加類型定義,然後我運行Typer獲取起點(erlang 15b02,typer 0.9.4)。使用typer出乎意料的結果

我挑了一些成果,以檢查是否每一件事情是好的,發現了這個結果,我不明白:

par(true, o) -> "("; 
par(true, f) -> ")"; 
par(_, _) -> "". 

其生產規格:

-spec par(boolean(),'f' | 'o') -> [40 | 41]. 

我能理解輸入參數,因爲這個函數沒有被導出,我的代碼只調用帶有布爾表達式作爲第一個參數的函數,而原子o或f作爲第二個參數(例如par(4 > P, o))。

但爲什麼返回列表不包含空列表?我曾期待過類似[40 | 41 | []][40 | 41 | ""]

此代碼用於打印數學表達式,並在優先級或運算符足夠時避免括號;例如打印

3 + 4 + 5 * (6 + 7) - sin(x + 7),而不是

3 + (4 + ((5 * (6 + 7)) - sin((x + 7))))

我確信該代碼被稱爲虛假作爲第一參數如由測試覆蓋的結果:

15..| par(true, o) -> "("; 
    15..| par(true, f) -> ")"; 
    308..| par(_, _) -> "". 

回答

5

作爲Erlang type specification[X]手段「X類型的零個或多個元素的列表」。在你的情況下,X40 | 41,所以"(",")","()()"""都匹配這種類型。沒有辦法只將一個元素的列表表示爲類型規範。

包含至少一個元素的列表可指定爲[X,...]。 typer說[40 | 41]而不是[40 | 41,...]的事實意味着它知道函數可以返回一個空列表。

+0

謝謝,我不記得...的含義,儘管它被用於其他結果。 – Pascal