2009-11-24 46 views
4

地方爲函數的條款的順序是不重要的,是它的基礎的情況下最後:在Erlang中是否有一種習慣的方法來命令函數子句?

all(Pred, [Head|Tail]) -> 
    case Pred(Head) of 
    true -> all(Pred, Tail); 
    false -> false 
    end; 
all(Pred, []) when is_function(Pred, 1) -> true. 

或者基本情況第一:

all(Pred, []) when is_function(Pred, 1) -> true; 
all(Pred, [Head|Tail]) -> 
    case Pred(Head) of 
    true -> all(Pred, Tail); 
    false -> false 
    end. 

從標準庫查看源代碼,它似乎這個慣例是最後的基本情況。這是首選的風格?是有原因的,還是隻是它的方式?

回答

5

只有第二種情況纔會起作用,因爲個案是按順序匹配的。

由於整數0能夠匹配模式N,因此如果它出現在後面,則永遠不會到達常量0子句。

這是模式匹配的有序方面,您在編寫函數子句,事例子句或任何其他此類潛在匹配序列時應考慮這一點。

+0

哎呀,對不起,這是一個不好的例子,我的意思是一個函數,其中子句的排序不會改變行爲。修改示例以反映這一點。 – pjb3 2009-11-24 04:31:49

4

它具有如何排序子句的語義。由於模式是按順序嘗試的。

我傾向於首先放置基本案例,因爲我認爲它使它更具可讀性。在閱讀遞歸部分時已經知道基本情況。

有時候我會覺得有些代碼首先會將最常見的模式放在第一位,以便保存最常見的情況,從而不必測試不太可能匹配的模式。

+0

是的,我同意。首先有基本情況對我來說更有意義,但這不是標準庫中的情況。在這方面出現的社區內可能沒有達成共識? – pjb3 2009-11-24 04:33:23

3

隨着[|][]我總是把基礎案例放在第一位,而無案例最後放在第一位。我認爲這更清楚,更自然。做相反的一個原因可能在於,它更類似於更一般的模式匹配,首先您可以找到更具體的案例,以便抓住它們;這裏[]就像更具體的情況。只是猜測。

+0

從微觀(或更確切的說是納米)的角度來看,按預期命中率排序子句有什麼好處嗎?例如,我想所有()會更經常被調用非空列表而不是空列表。 – Zed 2009-11-24 07:51:05

+0

它不會受到傷害,但編譯器在編譯模式匹配時通常會重新排序子句。不要這樣會影響當然的語義。這取決於模式的樣子。 – rvirding 2009-11-26 02:05:27

相關問題