UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture12/ tvar.rkt
#lang plait
(define-type Type
  [numT]
  [boolT]
  [arrowT (arg : Type)
          (result : Type)]
  [varT (id : Number)
        (val : (Boxof (Optionof Type)))])
(define gen-tvar-id!
(let ((counter 0))
  (lambda ()
    (begin
      (set! counter (add1 counter))
      counter))))
(define the-box (box (none)))
(define tau1 (arrowT (varT (gen-tvar-id!) the-box) (numT)))
(define tau2 (arrowT (varT (gen-tvar-id!) the-box) (numT)))
tau1 tau2 
(set-box! the-box (some (boolT))) tau1