Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 递归契约型敲打';s';Rec&x27;类型_Racket_Contract - Fatal编程技术网

Racket 递归契约型敲打';s';Rec&x27;类型

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,并用自引用替换“递归标识符” 下面是一

类型化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/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)