Racket 递归契约型敲打';s';Rec&x27;类型
类型化Racket的Racket 递归契约型敲打';s';Rec&x27;类型,racket,contract,Racket,Contract,类型化Racket的Rec类型是创建递归类型的简单方法: #lang typed/racket/base (define (deep (n : Integer)) : (Rec T (U Integer (List T))) (if (zero? n) n (list (deep (- n 1))))) 有没有类似的方法来创建递归契约? 球拍的不一样。合同表达式只是表达式!您可以编写一个宏,它接受输入,比如键入的Racket的Rec,并用自引用替换“递归标识符” 下面是一
Rec
类型是创建递归类型的简单方法:
#lang typed/racket/base
(define (deep (n : Integer)) : (Rec T (U Integer (List T)))
(if (zero? n)
n
(list (deep (- n 1)))))
有没有类似的方法来创建递归契约?
球拍的不一样。合同表达式只是表达式!您可以编写一个宏,它接受输入,比如键入的Racket的
Rec
,并用自引用替换“递归标识符”
下面是一个示例rec/c
组合器,其中(rec/c id ctc)
扩展为ctc
,所有出现的id
都替换为(递归合约id)
注:模式\uuID
与t
作为标识符的任何用法相匹配。原始Q/A松弛:
#lang racket/base
(require racket/contract (for-syntax racket/base syntax/parse))
(define-syntax-rule (rec/c t ctc)
(letrec ([rec-ctc
(let-syntax ([t (syntax-parser (_:id #'(recursive-contract rec-ctc)))])
ctc)])
rec-ctc))
(define/contract (deep n)
(-> integer? (rec/c t (or/c integer? (list/c t))))
(if (zero? n)
n
(list (deep (- n 1)))))
(deep 4)