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

标签 indexing erlang clause

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

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

谢谢。

最佳答案

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

这意味着没有真正需要重新排序参数来尝试优化模式匹配,至少不是为了速度。保持一致和清晰要好得多,这里是做吧,Is there an idiomatic way to order function arguments in Erlang? .这意味着代码没有问题,例如:

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(I, ...) when is_integer(I), I >= 3, I =< 6 ->
    ... ;
foo(7, ...) -> ... ;
foo(8, ...) -> ... .

索引会更好,但再次不要过度,因为差异不是很大,请保持清楚。这也适用于任何深度,例如在列表中元组的第一个元素的第一个代码示例中。

其中大部分是函数式语言的标准。

关于indexing - Erlang 索引子句是如何开头的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4921025/

相关文章:

erlang - Erlang 19.xx 是否符合 FIPS 标准?

mysql - 将表中的大列拆分为另一个较小列的表 MYSQL

sql - 为子字符串查询优化 Mysql 表索引

mysql - 复合索引

tcp - Erlang中socket的 "packet"选项怎么能把tcp传输加速这么多?

erlang - 确定 Erlang 进程的核心

SQL Where 子句 Maximo IBM

hibernate - where 子句中的日期 --- org.hibernate.hql.internal.ast.QuerySyntaxException : unexpected token: Mar

algorithm - 如何只对 Haskell 中的奇数索引做某事?

mysql - 为什么我的类似查询的处理方式大不相同?