是否有一种习惯的方式来在Erlang中订购函数子句?

时间:2009-11-24 03:44:58

标签: 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.

通过查看标准库中的源代码,似乎约定是基本案例。这是首选的风格吗?它是有原因的,还是只是它的方式?

3 个答案:

答案 0 :(得分:5)

只有第二种情况才有效,因为案件按顺序匹配。

由于整数0能够匹配模式N,因此如果它出现,则永远不会达到常量0子句。

这是模式匹配的有序方面,在编写函数子句,case子句或任何其他类似的潜在匹配序列时应该考虑。

答案 1 :(得分:4)

它具有语义含义如何排序子句。由于模式是按顺序尝试的。

我倾向于将基础案例放在首位,因为我认为它使其更具可读性。在阅读递归部分时已经知道了基本情况。

有时我觉得某些代码首先放置了最常见的模式,以保存最常见的情况,因为必须测试不太可能匹配的模式。

答案 2 :(得分:3)

使用[|][]我总是将基本情况放在第一位,而将最后一种情况放在最后,就像你的第一种情况一样。我认为这更清晰,更自然。做相反的一个原因可能是它更像是更普遍的模式匹配,在这种模式匹配中,您首先拥有更具体的案例以便捕获它们;这里[]就像更具体的情况。只是猜测。