键入Rakcet,如何定义一个排除其他类型的类型

时间:2019-11-15 06:51:15

标签: racket typed-racket

我想定义一个这样的类型 enter image description here

有可能吗?

1 个答案:

答案 0 :(得分:4)

否,Typed Racket不允许您将类型定义为其他类型的排除或“补充”。

但是,根据您的特定情况,可能有一些方法可以“满足”您的需求;可能不令人满意的不完整补丁工作,具体取决于您想对此类型做什么。

一种方法是带有否定谓词的不透明类型。如果要排除的类型是纯一阶的或具有谓词,则可以否定该谓词,并定义传递否定谓词的值的类型。

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

优点:如果在类型化和未类型化代码之间的接口中使用此类型,则会使用适当的谓词对其进行廉价检查。

缺点:类型系统不知道AnyNotStringString类型或string?谓词之间的关系。

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