由于Erlang是一种几乎纯粹的函数式编程语言,我认为这是可能的:
case X of
foo(Z) -> ...
end.
其中foo(Z)
是可判定可逆的纯(无副作用)双射函数,例如:
foo(input) -> output.
然后,如果X = output
,Z
匹配为input
。
在Erlang中是否可以使用这种语义,有或没有我的例子的其他语法?
答案 0 :(得分:4)
不,你想要的是不可能的。
要做这样的事情,你需要能够找到任何双射函数的逆,这显然是不可判定的。
答案 1 :(得分:2)
我想不允许这样做的原因是你想要保证缺乏副作用。鉴于以下结构:
case Expr of
Pattern1 [when GuardSeq1] ->
Body1;
...;
PatternN [when GuardSeqN] ->
BodyN
end
评估Expr
后,模式会按照Expr
的结果顺序匹配。想象一下,您的foo/1
函数包含副作用(例如,它发送消息):
foo(input) ->
some_process ! some_msg,
output.
即使第一个模式不匹配,您仍然会发送消息,但无法从那种情况中恢复。
答案 2 :(得分:1)
你能做的是:
Y = foo(Z),
case X of
Y -> ...
end.
答案 3 :(得分:1)
不,Erlang只支持文字模式!
您的原始请求并不容易。仅仅因为存在反转并不意味着它很容易找到。实际上,编译器必须制作两个版本的函数。