Indexing Erlang索引子句是如何开头的?

Indexing Erlang索引子句是如何开头的?,indexing,erlang,clause,Indexing,Erlang,Clause,我来自Prolog的背景。Prolog通常在谓词的第一个参数上建立索引(大多数体面的系统允许您改变这一点,在多个参数上建立索引,等等)。无论如何,了解引擎索引子句的方式可以让您安排参数和谓词以获得更好的性能 我最近一直在用Erlang编写代码,但没有看到任何关于它如何索引子句头以及如何安排参数和子句的信息。有人知道吗 谢谢。所有参数的Erlang索引从左到右,任何深度和所有类型。Simon Peyton Jones在中描述了我们使用的基本算法,并从中摘取,我对其进行了修改,以适应Erlang处理

我来自Prolog的背景。Prolog通常在谓词的第一个参数上建立索引(大多数体面的系统允许您改变这一点,在多个参数上建立索引,等等)。无论如何,了解引擎索引子句的方式可以让您安排参数和谓词以获得更好的性能

我最近一直在用Erlang编写代码,但没有看到任何关于它如何索引子句头以及如何安排参数和子句的信息。有人知道吗


谢谢。

所有参数的Erlang索引从左到右,任何深度和所有类型。Simon Peyton Jones在中描述了我们使用的基本算法,并从中摘取,我对其进行了修改,以适应Erlang处理类型的方式。这是一本好书,即使它现在有点旧了,对我来说是一次真正的AHA经历

这意味着不需要重新排序参数来尝试优化模式匹配,至少在速度方面不需要。保持一致和清晰要好得多,以下是我如何做到这一点。这意味着代码没有问题,例如:

foo(X, [{a,A}|Rest], ...) -> ... ;
foo(X, [{b,B}|Rest], ...) -> ... ;
foo(X, [{c,C}|Rest], ...) -> ... ;
foo(X, [{d,D}|Rest], ...) -> ... ;
...
永远不需要尝试通过将其分解为嵌套的
case
表达式来“帮助”编译器,通常情况会更糟。这样做的唯一原因是,如果它能使代码更清晰地显示您的意图

如果您确实想尝试并优化模式匹配,请尝试对子句进行重新排序,以便出现文字的所有情况都集中在一起。例如:

foo(1, ...) -> ... ;
foo(2, ...) -> ... ;
foo(7, ...) -> ... ;
foo(8, ...) -> ... ;
foo(I, ...) when is_integer(I), I >= 3, I =< 6 ->
    ... .
foo(1,…)->;
foo(2,…)->;
foo(7,…)->;
foo(8,…)->;
foo(I,…)当是_整数(I),I>=3,I=<6->
... .

foo(1, ...) -> ... ;
foo(2, ...) -> ... ;
foo(I, ...) when is_integer(I), I >= 3, I =< 6 ->
    ... ;
foo(7, ...) -> ... ;
foo(8, ...) -> ... .
foo(1,…)->;
foo(2,…)->;
foo(I,…)当是_整数(I),I>=3,I=<6->
... ;
foo(7,…)->;
傅(8)->。
索引将更好,但再次不要过度,因为差异不是那么大,请保持清晰。这在任何深度都是有效的,例如在列表中元组的第一个元素所在的第一个代码示例中


这对于函数式语言来说是相当标准的。

谢谢!这就回答了我的问题。我必须在这里补充一点,匹配的二进制文件需要特别考虑才能真正优化它,请阅读说明。但基本规则仍然适用。如果RVIVIDEN的回答足够地回答你的问题(如你的评论中所暗示的),请考虑实际选择它作为正确答案(在答复的分数下的复选标记)。