“普通”函数通常只在给定类型的对象域上定义,但某些函数,例如 Scheme 类型谓词list?
或procedure?
,是为任何类型的参数定义的,甚至可以应用于它们自己。所以 eg(list? procedure?)
评估为#f
并(procedure? procedure?)
评估为#t
。我试图弄清楚如何编写此类完全定义的函数,但无法找到讨论此问题的来源。
例如,假设我们使用以下构造函数和选择器实现了计算机程序的结构和解释的练习 2.4 中描述的对数据类型:
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
(define (cdr z)
(z (lambda (p q) q)))
然后我将如何定义一个谓词,该谓词pair?
返回#t
使用 构造的任何东西cons
,以及#f
任何不是的东西?list?
更一般地说,类型谓词是如何procedure?
实现的?