data Expr = App Expr Expr | Abs Int Expr | Var Int deriving (Show,Eq)
eval1cbv :: Expr -> Expr
eval1cbv (Var x) = (Var x)
eval1cbv (Abs x e) = (Abs x e)
eval1cbv (App (Abs x e1) e@(Abs y e2)) = eval1cbv (subst e1 x e)
eval1cbv (App e@(Abs x e1) e2) = eval1cbv (subst e2 x e)
eval1cbv (App e1 e2) = (App (eval1cbv e1) e2)
其中subst
是用于定义替换的函数。
然而,当我试图使用beta约简来约简表达式时,我得到了一个非穷举模式错误,我不明白为什么。我能做的修复它是在底部添加一个额外的大小写,如下所示:
eval :: Expr -> Expr
eval (Abs x e) = (Abs x e)
eval (App (Abs x e1) e@(Abs y e2)) = subst e1 x e
eval (App e@(Abs x e1) e2) = App e (eval e2)
eval (App e1 e2) = App (eval e1) e2
eval (Var x) = Var x
但是,如果我这样做了,那么lambda表达式根本不会被缩减,这意味着函数的输入和输出是相同的。
谁能帮我弄清楚这件事吗?:)
但是当我为一个更大的测试用例运行它时,比如:
eval (App (Abs 1 (Abs 2 (Var 1))) (Var 3))
当您尝试将ABS x E
形式应用到VAR Y
时,您就在这个分支中,
eval (App e@(Abs x e1) e2) = App e (eval e2)
所以你有,
App (Abs x e) (Var y)
= App (Abs x e) (eval (Var y))
= App (Abs x e) (Var y)
eval (App e1 e2) = App (eval e1) e2
eval (App (Abs x e1) e@(Abs y e2)) = subst e1 x e
如果替换的结果是一个应用术语,会发生什么?会对结果进行评估吗?
编辑
关于您的更改,给定Lamapp e1 e2
,您之前遵循的是按值调用的评估策略(即在替换之前评估e2
)。那就没了,
eval1cbv (LamApp (LamAbs x e1) e@(LamAbs y e2)) = eval1cbv (subst e1 x e)
eval1cbv (LamApp e@(LamAbs x e1) e2) = eval1cbv (subst e2 x e)
eval1cbv (LamApp e1 e2) = (LamApp (eval1cbv e1) e2)
我在Haskell编程中的冒险并不都是史诗般的。我正在实现简单的Lambda演算,我很高兴完成了、以及,希望它们是正确的。剩下的是,就像红色框中定义的那样(在下图中),我正在为此寻找指导。 如果我说错了请指正, (1)但是我发现返回给定变量的类型。Haskell中的什么构造返回?我知道在中是,但我正在寻找一个在下工作的。 (3)对于(T-APP)和(T-ABS),我假设我分别对和应用程序应用了替换
我发现优先级和关联性是一个很大的障碍,让我理解语法在haskell代码中试图表达的内容。 例如, 通过实验,我终于明白了, 你们谁能提供一些参考,让语法更容易掌握吗?
Proceed to site to know how to use the AWS Lambda Haskell Runtime.
我现在被困在实现“alpha-同余”(在一些教科书中也被称为“alpha-等价”或“alpha-相等”)上。我希望能够检查两个λ表达式是否相等。例如,如果我在解释器中输入以下表达式,它应该得到True(用于指示lambda符号): 问题在于理解下列λ表达式是否被认为是alpha等价的: 在的情况下,我猜答案是。这是因为和,两者的右侧是相等的(其中符号用于表示alpha缩减)。 简而言之,如何实现函
部分答案可能来自领域理论。如果我理解正确的话,的元素并不全是集合论函数(根据康托定理,这些函数比大),而只是连续函数。如果是,定义这种连续性的拓扑是什么?为什么类型的Haskell术语对它是连续的?