Erlang 模式匹配函数头中的表达式

Erlang 模式匹配函数头中的表达式,erlang,Erlang,为什么你不能这样做: r() -> 10. result(r()) -> match; result(_) -> no_match. 错误:非法模式。Erlang参考手册提供了一些关于为什么不可能这样做的更多信息。 每个参数都是一种模式 , 模式与术语具有相同的结构,但可以包含未绑定的变量 任何数据类型的数据段都称为术语 总之:函数调用不是一个术语,因此也不是一种模式。因为它不是一个模式,所以不能在模式匹配中使用,因此不能在函数子句中使用。模式

为什么你不能这样做:

r() ->
     10.

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

错误:非法模式。

Erlang参考手册提供了一些关于为什么不可能这样做的更多信息。

每个参数都是一种模式

,

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

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


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

模式是编译时,函数调用的结果是运行时。在Erlang C++中没有<代码> CONSTEPRPR <代码>函数。我很好奇知道什么是预期行为,以及这个尝试的用例是什么来定义常数,然后可以使用宏:<代码> -定义(R,10)。< /代码>。然后您可以像这样使用它:
result(?R)->match;result()->no_match.
这是一个聪明的参数,但是在代码中所有函数调用都被它们的返回值替换,函数调用的返回值是一个术语。因此,如果erlang首先计算表达式,然后进行模式匹配,那么我的代码将符合您发布的定义,因此我认为更好的答案是先进行模式匹配,然后计算表达式。我认为您发布的描述可以归结为一条规则,即模式不能包含表达式,例如,
Y=2,{X,Y+1}={hello,3}。
=>非法模式。但是我知道。@7stud:是的,你是对的。但是请注意,模式中允许使用某些表达式,请参阅<允许对字符串前缀使用code>++,也可以使用涉及常量的数字或位运算符。在这种情况下,表达式求值发生在模式匹配之前,将整个过程再次上下颠倒。