答案 0 :(得分:4)
否,Typed Racket不允许您将类型定义为其他类型的排除或“补充”。
但是,根据您的特定情况,可能有一些方法可以“满足”您的需求;可能不令人满意的不完整补丁工作,具体取决于您想对此类型做什么。
一种方法是带有否定谓词的不透明类型。如果要排除的类型是纯一阶的或具有谓词,则可以否定该谓词,并定义传递否定谓词的值的类型。
(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
string?
谓词返回false不会告诉类型系统有关AnyNotString
的任何信息