调整Racket中定义的类型

时间:2017-05-10 14:46:48

标签: 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)))

如何定义带有签名(lift s t)的过程(-> subst term term),该过程取决于tvname还是(Listof (Pairof String term))?有没有一种简单的方法来测试联合类型的实际类型?如果我改为(define-type term (U String Integer)),我可以使用string?来测试t是否为字符串;我如何将此扩展到我的情况?

2 个答案:

答案 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))))