Lambda表达式的替换函数

时间:2015-06-27 18:45:15

标签: function haskell lambda substitution

我目前正在编写该功能,我无法解决第四种情况,那就是:

  

(E1 E2)[v-> E] = E1 [v-> E] E2 [v - > E]

我已经定义了前3个(对于常量和变量),但事实证明这对我来说太棘手了。

但是,函数签名是:

sub :: LExpr -> String -> LExpr -> LExpr 

我首先感到困惑的是如何表示参数(E1 E2)以及后来如何表示E1[v->E] E2[v -> E] - 部分。我认为++在这里不起作用,因为结果必须是lambda表达式而不是String。

data LExpr的定义是Haskell的“常见”定义,并使用EqShow。如果需要我可以提供它,但它非常基本,你必须熟悉它。

1 个答案:

答案 0 :(得分:1)

嗯,定义只是重写

(E1 E2)[v->E] = E1[v->E] E2[v -> E]

进入Haskell语法。首先,我们使用sub代替[v -> E]符号。

sub (E1 E2) v E = (sub E1 v E) (sub E2 v E)

然后我们在LExpr显式之间进行语法应用。

sub (App E1 E2) v E = App (sub E1 v E) (sub E2 v E)

最后,我们对变量使用小写名称,因为Haskell为构造函数保留了大写的名称。

sub (App e1 e2) v e = App (sub e1 v e) (sub e2 v e)