对于子句的顺序不重要的函数,最后是基本情况:
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 能够匹配模式 N,如果它出现在后面,则永远不会到达常量 0 子句。
在编写函数子句、case 子句或任何其他此类潜在匹配序列时,您应该考虑模式匹配的有序方面。
关于erlang - 有没有一种惯用的方式来在 Erlang 中对函数子句进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1787640/