【问题标题】:Pattern matching an expression in the head of a function模式匹配函数头部的表达式
【发布时间】:2017-03-23 15:53:12
【问题描述】:

你为什么不能这样做:

r() ->
     10.

result(r()) ->
    match;
result(_) ->
    no_match.

错误:非法模式。

【问题讨论】:

  • 模式是编译时,函数调用的结果是运行时。 Erlang 中没有来自 C++ 的 constexpr 函数。
  • 我很想知道预期的行为是什么,以及这次尝试的用例是什么
  • 如果你想要定义一个常量,那么你可以使用宏:-define(R, 10).。然后你会像这样使用它:result(?R) -> match; result(_) -> no_match.

标签: erlang


【解决方案1】:

Erlang 参考手册提供了更多关于为什么这是不可能的信息。 It specifies that

每个参数都是一个模式。

Additionally,

模式与术语具有相同的结构,但可以包含未绑定的变量。

And it defines a term as

任何数据类型的一段数据称为术语。

总之:函数调用不是一个术语,因此也不是一个模式。由于它不是模式,因此不能在模式匹配中使用,因此不能在函数子句中使用。

【讨论】:

  • 这是一个聪明的论点,但是所有的函数调用在你的代码中都被它们的返回值所取代,而函数调用的返回值一个术语。因此,如果 erlang 先评估表达式,然后进行模式匹配,我的代码将符合您发布的定义,所以我认为更好的答案是先完成模式匹配,然后评估表达式。我认为您发布的描述归结为模式不能包含表达式的规则,例如Y=2, {X, Y+1} = {hello, 3}. => 非法模式。但我知道。
  • @7stud:是的,你是对的。但是请注意,模式中允许使用某些表达式,请参阅erlang.org/doc/reference_manual/expressions.html#id80283++ 允许使用字符串前缀,以及涉及常量的数字或按位运算符。在这种情况下,表达式评估发生在模式匹配之前,将整个事情再次颠倒过来。
猜你喜欢
  • 1970-01-01
  • 2020-04-29
  • 2011-12-03
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2011-07-07
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多