【问题标题】:Why am I getting an error with this simple scheme code?为什么这个简单的方案代码会出错?
【发布时间】:2021-06-15 04:01:14
【问题描述】:
(define ZERO (lambda (f x) x))    
(define ONE (lambda (f x) (f x)))
(define SUCC (lambda (n) (lambda (f x) (f (n f x)))))
(display (ZERO 1 0))
(display (ONE 1 0))
(display ((SUCC ZERO) 1 0))

ZERO 功能可以正常工作。当我运行这段代码时,我得到一个错误,

错误:无效应用程序:(1 0)

用于ONESUCC 函数。

如何修复我的代码以使其正常工作?

【问题讨论】:

  • ONE 的第一个参数必须是函数,这样你才能执行(f x)
  • 例如(ONE + 3) 等价于 (+ 3)
  • 您希望(display (ONE 1 0)) 打印什么?
  • 我想我现在明白了!非常感谢!

标签: scheme


【解决方案1】:

这是数字的 Church 编码;数字 K 由函数 f 对某个参数 x 的 K 次应用表示。
(令人惊讶的是,函数的恒等式和该参数无关紧要 - 你可以构建所有数学而不用关心。)

您可以通过适当的选择 fx 使其变得有意义 - 例如,尝试 0

(define (inc x) (+ x 1))

所以数字 K 表示为 0 加 1,K 次。

> (ZERO inc 0)
0
> (ONE inc 0)
1
> ((SUCC ONE) inc 0)
2

您还可以使用评估函数添加一些便利:

> (define (number n) (n inc 0))
> (number ZERO)
0
> (number ONE)
1
> (number (SUCC (SUCC (SUCC (SUCC ONE)))))
5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2018-02-23
    • 2012-07-13
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多