2017-06-13 66 views
0

類型化球拍的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

Slack上的原始問答:https://racket.slack.com/archives/C06V96CKX/p1496706050248551 –

回答

0

合約表達式只是表達式!您可以編寫一個宏,其輸入如類型球拍的Rec,並用自引用代替「遞歸標識符」。

下面是一個例子rec/c組合子,其中(rec/c id ctc)擴展到ctc(recursive-contract id)取代的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作爲標識符相匹配的圖案。