【问题标题】:What data structure is used to implement pattern match?使用什么数据结构来实现模式匹配?
【发布时间】:2020-10-14 05:38:03
【问题描述】:

在《Programming Elixir》一书中,作者指出“即使你有数千个子句,这种方式使用的模式匹配也很快。匹配一个映射或结构是 O(log n)。”。

我想知道 Elixir 中使用什么数据结构来实现模式匹配,使得时间复杂度为 O(log n)。

它是某种树结构吗?

【问题讨论】:

标签: pattern-matching elixir


【解决方案1】:

模式匹配的实现因函数式语言而异,但在大多数情况下,它归结为决策树。

Luc Maranget paper“将模式匹配编译为好的决策树”对如何将模式匹配实现到决策树进行了很好的深入描述。

另一个非常好的资源是 Simon Peyton Jones 的 book“函数式编程语言的实现”。

【讨论】:

  • Joe 在他的演讲中说了很多,模式匹配是基于 prolog 中的实现的。
  • Robert Virding,Elixir 使用的 Erlang 模式匹配的编写者,states Erlang 使用 SPJ 书中的算法。
【解决方案2】:

Elixir 委托 Erlang 的模式匹配。

查看 Elixir 的源代码,用 Erlang 编写,这里似乎是处理匹配的代码:

elixir_clauses.erl:

match(Fun, Expr, #{current_vars := Current, unused_vars := {_, Counter} = Unused} = AfterE, BeforeE) ->
  #{
    context := Context,
    prematch_vars := Prematch,
    current_vars := {Read, _}
  } = BeforeE,

  CallE = BeforeE#{
    context := match,
    prematch_vars := {Read, Counter},
    current_vars := Current,
    unused_vars := Unused
  },

  {EExpr, #{current_vars := NewCurrent, unused_vars := NewUnused}} = Fun(Expr, CallE),

  EndE = AfterE#{
    context := Context,
    prematch_vars := Prematch,
    current_vars := NewCurrent,
    unused_vars := NewUnused
  },

  {EExpr, EndE}.

这是 Erlang 代码,所以 Elixir 在这里委托给Erlang's = operator。既然如此,Robert Virding(Erlang 模式匹配代码的作者)对this related Erlang question 的回答很有用:

在“The 函数式编程语言的实现”,Simon Peyton 琼斯。这本书有点旧,但非常好。它还包含,其中 其他内容,编译列表推导的描述。

Erlang 编译器使用书中的这两种算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多