键入的Racket' Rec
类型是一种简单的递归类型方法:
#lang typed/racket/base
(define (deep (n : Integer)) : (Rec T (U Integer (List T)))
(if (zero? n)
n
(list (deep (- n 1)))))
是否有类似的方式来制作递归合约?
球拍的recursive-contract
不一样。
答案 0 :(得分:0)
合同表达只是表达式!你可以编写一个宏,它接受像Typed Racket' Rec
这样的输入并替换"递归标识符"有自我参考。
这是一个示例rec/c
组合子,其中(rec/c id ctc)
扩展为ctc
,所有id
替换为(recursive-contract id)
。
#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)
注意:模式_:id
匹配使用t
作为标识符。