对于条款排序不重要的函数,最后是基本情况:
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.
通过查看标准库中的源代码,似乎约定是基本案例。这是首选的风格吗?它是有原因的,还是只是它的方式?
答案 0 :(得分:5)
只有第二种情况才有效,因为案件按顺序匹配。
由于整数0能够匹配模式N,因此如果它出现,则永远不会达到常量0子句。
这是模式匹配的有序方面,在编写函数子句,case子句或任何其他类似的潜在匹配序列时应该考虑。
答案 1 :(得分:4)
它具有语义含义如何排序子句。由于模式是按顺序尝试的。
我倾向于将基础案例放在首位,因为我认为它使其更具可读性。在阅读递归部分时已经知道了基本情况。
有时我觉得某些代码首先放置了最常见的模式,以保存最常见的情况,因为必须测试不太可能匹配的模式。
答案 2 :(得分:3)
使用[|]
和[]
我总是将基本情况放在第一位,而将最后一种情况放在最后,就像你的第一种情况一样。我认为这更清晰,更自然。做相反的一个原因可能是它更像是更普遍的模式匹配,在这种模式匹配中,您首先拥有更具体的案例以便捕获它们;这里[]
就像更具体的情况。只是猜测。