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

pjb*_*jb3 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.
Run Code Online (Sandbox Code Playgroud)

或者基础案例:

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

从查看标准库中的源代码看,该约定似乎是最后的基础案例.这是首选的风格吗?它是有原因的,还是只是它的方式?

Jus*_*ehy 5

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

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

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