Scheme 球拍中定义类型的条件作用

Scheme 球拍中定义类型的条件作用,scheme,racket,typed-racket,Scheme,Racket,Typed Racket,我在Racket中定义了以下类型: (define-type vname (Pairof String Integer)) (define-type term (U vname (Listof (Pairof String term)))) (define-type subst (Listof (Pairof vname term))) 如何使用signature->subst term定义一个过程lift st,该过程取决于t的类型是vname还是Listof Pairof String

我在Racket中定义了以下类型:

(define-type vname (Pairof String Integer))

(define-type term (U vname (Listof (Pairof String term))))

(define-type subst (Listof (Pairof vname term)))

如何使用signature->subst term定义一个过程lift st,该过程取决于t的类型是vname还是Listof Pairof String term?有没有一种简单的方法来测试联合类型的实际类型?如果我改为定义类型术语U字符串整数,我可以使用字符串?测试t是否为字符串;我如何将这一点扩展到我的情况?

工会不是歧视性工会,因此没有自动实现这一点的方法。但是,在这种特殊情况下,您可以区分两者,因为vname始终是在cdr位置具有整数的对,而Listof Pairof String term类型的值将是“或”,否则将是在cdr位置具有可能为空列表的对。那么谓词vname呢?可定义为:

(define (vname? x)
  (and (pair? x) (exact-integer? (cdr x))))

我在TypedRacket中遇到过类似的问题,我发现为所有非平凡类型定义结构更简单。然后可以使用结构谓词区分类型,例如

(struct vname (name val))
(vname? (struct "foo" 5))

但我如何使用结构定义术语?我不熟悉您的问题。但看起来您可以定义一个struct foo str term,然后定义类型term U vname Listof foo。您甚至可以定义一个结构来包装列表本身。