functional-programming - 如何使用 S、K 和 I 组合器编写一个空列表?

标签 functional-programming lisp lambda lambda-calculus

我知道:

(cons [p] [q]) is ((s ((s i) (k [p]))) (k [q]))
(car [lst]) is ([lst] k)
(cdr [lst]) is ([lst] (k i))

我想写一个这样的列表

(cons [a] (cons [b] (cons [c] [nil])))

,这将是这样的:

((s ((s i) (k [a]))) (k ((s ((s i) (k [b]))) (k ((s ((s i) (k [c]))) (k [nil]))))))

但我不知道如何将“nil”编译成 S、K 和 I 组合器。有人知道吗?

提前致谢, 埃德温·何塞·帕拉辛卡尔

最佳答案

nil 表示中你唯一需要的是能够识别它——写一些 null? 谓词为 nil 返回“true” 和所有其他对的“false”。这意味着答案取决于您对真/假的表述。通过共同选择 λxy.xλxy.ynil 的方便编码是 λf.[true]。将其翻译成 SKI 现在非常容易(我不会在这里做,因为它看起来像家庭作业......)。

(另外,给定 nil 的这种表示形式,实现一个 null? 谓词是一个很好的练习。)

关于functional-programming - 如何使用 S、K 和 I 组合器编写一个空列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1277259/

相关文章:

open-source - 用函数式编程语言编写的开源项目

functional-programming - 关于闭包中词法绑定(bind)的更多解释?

c# - Html 通过 lambda 扩展模型的两个属性

haskell 如果为真则中断或继续循环

JavaScript 的 bind() 带有柯里化(Currying)。这些代码是如何工作的?

scala - 理解 Scala 隐式

recursion - LISP 中的连接子列表在一个大列表中

let 语句的 Lisp 评估

c# - 重写 Expression<T> 的类型

c++ - 为什么此模板参数推断失败?