【发布时间】:2021-07-02 19:37:14
【问题描述】:
我正在尝试解决 Church 数字解析器我有一个自定义类型,可以区分变量、lambda 和应用程序
type Var = String
data Term =
Variable Var
| Lambda Var Term
| Apply Term Term
deriving Show
我有一个函数叫church
我可以为不同的教堂手动定义一个案例。所以让我们说:
-
church 0Lambda "f" (Lambda "x" (Variable "x")) -
church 1应该输出Lambda "f" (Lambda "x" (Apply (Variable "f") (Variable "x"))) -
church 2应该输出Lambda "f" (Lambda "x" (Apply (Variable "f") (Apply (Variable "f") (Variable "x"))))
等等。
我已经尝试按照以下方式递归调用教堂函数:
church :: Int -> Term
church 0 = Lambda "f" (Lambda "x" (Variable "x"))
church i = Apply (church(i -1)) (Apply (Variable "f") (Variable "x"))
但是,Lambda "f" (Lambda "x" 的部分也不断重复
我尝试过的另一种方法是
church :: Int -> Term
church 0 = Lambda "f" (Lambda "x" (Variable "x"))
church i = Apply (church (i -1)) (Apply (Variable "f") (Variable "x"))
但是,这也会产生复制 lambda 的结果。我在这里错过了什么吗?怎么只能重复申请部分(Apply (Variable "f") (Variable "x"))
【问题讨论】:
-
第一个代码片段的间距看起来不对,它呈现为
church0和churchi。 -
好地方。更新了旧约。