我在Racket中定义了以下类型:
(define-type vname (Pairof String Integer))
(define-type term (U vname (Listof (Pairof String term))))
(define-type subst (Listof (Pairof vname term)))
如何定义带有签名(lift s t)
的过程(-> subst term term)
,该过程取决于t
是vname
还是(Listof (Pairof String term))
?有没有一种简单的方法来测试联合类型的实际类型?如果我改为(define-type term (U String Integer))
,我可以使用string?
来测试t
是否为字符串;我如何将此扩展到我的情况?
答案 0 :(得分:1)
我在Typed Racket中遇到过类似的问题,我发现为所有非常重要的类型定义结构更简单。然后,您可以使用struct谓词来区分类型,例如
validation*()
答案 1 :(得分:0)
工会不是一个受歧视的工会,所以没有自动的方法来做到这一点。但是,在这种特殊情况下,您可以区分这两者,因为vname
始终是Integer
位置cdr
的一对,而类型(Listof (Pairof String term))
的值将是'()
或者是cdr
位置中具有(可能为空)列表的对。因此谓词vname?
可以定义为:
(define (vname? x)
(and (pair? x) (exact-integer? (cdr x))))