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
的任何信息
我想定义这样的类型
可以吗?
不,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
的任何信息