递归合同,如Typed Racket' Rec'类型

时间:2017-06-13 18:53:43

标签: 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)))))

是否有类似的方式来制作递归合约? 球拍的recursive-contract不一样。

1 个答案:

答案 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作为标识符。