【问题标题】:recursive contract like Typed Racket's 'Rec' type递归合约,如 Typed Racket 的 'Rec' 类型
【发布时间】:2017-06-13 18:53:43
【问题描述】:

Typed 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 的recursive-contract 不一样。

【问题讨论】:

标签: racket contract


【解决方案1】:

合同表达式只是表达式!您可以编写一个宏,它接受 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 作为标识符。

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 2012-10-14
    • 2014-05-27
    • 2015-06-28
    • 1970-01-01
    • 2021-07-11
    • 2011-01-01
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多