Typed Racket,如何定义排除另一种类型的类型

Typed Rakcet, How to define a type which is the exclusion of another type

我想定义这样的类型

可以吗?

不,Typed Racket 不允许您将类型定义为排除或 "complement" 其他类型。

但是,根据您的具体情况,可能有方法"part"满足您的需求;不完整的补丁作业,可能令人满意也可能不令人满意,具体取决于您要使用此类型做什么

一种方法是带有否定谓词的不透明类型。如果你想排除的类型是纯一阶的或者有一个谓词,你可以否定那个谓词,并定义传递否定谓词的值的类型。

(define (not-string? v) (not string?))
(define-type AnyNotString (Opaque not-string?))
(define-predicate anynotstring? AnyNotString)

优点:如果您在类型化代码和非类型化代码之间的接口中使用此类型,将使用适当的谓词以低廉的成本进行检查。

缺点:类型系统不知道 AnyNotString 应该与 String 类型或 string? 谓词的关系。

  • 它不认为 (U AnyNotString String)Any
  • 它不认为 (∩ AnyNotString String)Nothing
  • 返回 false 的 string? 谓词不会告诉类型系统有关 AnyNotString
  • 的任何信息