代码之家  ›  专栏  ›  技术社区  ›  pjb3

在Erlang中有没有一种惯用的方法来排序函数子句?

  •  4
  • pjb3  · 技术社区  · 15 年前

    对于子句顺序不重要的函数,它是否是最后一个基本情况:

    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 回复  |  直到 15 年前
        1
  •  5
  •   Justin Sheehy    15 年前

    只有第二个案例可以工作,因为案例是按顺序匹配的。

    因为整数0能够匹配模式N,所以如果常量0在后面,它就永远无法到达。

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

        2
  •  4
  •   Christian    15 年前

    它在语义上意味着从句是如何排列的。因为模式是按顺序尝试的。

    我倾向于把基本情况放在第一位,因为我认为这会使它更具可读性。在读取递归部分时已经知道基本情况。

        3
  •  3
  •   rvirding    15 年前

    [|] [] 我总是把基本情况放在第一位,而无案例放在最后,就像你的第一个案例一样。我觉得这更清晰,更自然。反其道而行之的一个原因可能是,它更像是更一般的模式匹配,在这里,您首先有更具体的情况,以便捕捉它们;这里 [] 会是更具体的情况。只是猜测而已。