2011-07-05 53 views
5

作为Erlang是几乎纯函数型编程语言,我想像这是可能的:二郎图案与功能匹配

case X of 
    foo(Z) -> ... 
end. 

foo(Z)其中一个是可判定可逆纯的(无副作用)的双射功能,如:

foo(input) -> output. 

然后,在情况下X = outputZ将匹配为input

是否有可能在Erlang中使用这样的语义(带或不带其他语法)?

回答

1

没有,二郎只支持文字图案!

而你原来的要求并不容易。仅仅因为存在一个倒数并不意味着它很容易找到。实际上,编译器将不得不制作两个版本的函数。

4

不,你想要的是不可能的。

要做这样的事情,你需要能够找到任何双射函数的逆,这显然是不可判定的。

+3

@Pindatjuh:我知道什么是双射函数。但是,仅仅因为每个双射函数都有一个逆并不意味着你可以编写一个算法来找到它(你不能)。 – sepp2k

+0

我会编辑这个问题:一个可逆的纯双射函数。 – Pindatjuh

2

我想为什么不允许的原因是你想保证缺乏副作用。鉴于以下结构:

case Expr of 
    Pattern1 [when GuardSeq1] -> 
     Body1; 
    ...; 
    PatternN [when GuardSeqN] -> 
     BodyN 
end 

后您评估Expr,该图案依次反对Expr的结果基本吻合。想象一下,你foo/1函数包含副作用(例如将消息发送):

foo(input) -> 
    some_process ! some_msg, 
    output. 

即使第一图案将不匹配,你无论如何都会发来的消息,你不能从困境中恢复过来。

+0

谢谢,但我的意思是“纯功能”,它不允许有副作用。我将编辑该问题。 – Pindatjuh

+1

我明白这一点。但问题是如何确保函数是纯粹的,而且是用户定义的。 –

1

你可以做的是:

Y = foo(Z), 
case X of 
    Y -> ... 
end. 
+2

这需要你知道Z的价值。我很确定这不是OP的意图。 – sepp2k

+0

那么,如果用'foo_inverse'替换'foo',这是有道理的。然而,正如sepp2k所说,这不是我的意图。 – Pindatjuh