erlang - 有没有一种惯用的方式来在 Erlang 中对函数子句进行排序?

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

从标准库中的源代码来看,约定似乎是最后一个基本情况。这是首选的风格吗?有没有原因,或者只是它的方式?

最佳答案

只有第二种情况会起作用,因为情况是按顺序匹配的。

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

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

关于erlang - 有没有一种惯用的方式来在 Erlang 中对函数子句进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1787640/

相关文章:

linux - 如何在 erlang 中更改我的主机名

erlang - 如何检测代码中是否已经创建了mnesia模式和表?

erlang - 是否可以在集群中运行 Mnesia 而不进行复制

coding-style - Erlang 风格 - 案例与函数模式匹配

Erlang:从函数返回一个函数

scala - Erlang/Scala 将 Actor 从一个节点迁移到另一个节点

erlang - 控制日志输出

c++11 - 使用 Boost.Fiber,c++ 是否更接近 Erlang 风格的进程/线程?

erlang - 整数和原子之间的 IF 语句

erlang - 为什么 Erlang 的开放电信平台 (OTP) 没有移植到其他语言?