Racket 如何避免带有文字数字和基于文字数字的类型的类型注释?

Racket 如何避免带有文字数字和基于文字数字的类型的类型注释?,racket,typed-racket,Racket,Typed Racket,在类型化球拍中,如果我具有以下类型和功能: (define-type A (U 'one 'two)) (define (f [a : A]) : A a) 然后函数调用(f'one)类型检查。但是,如果我使用文字数字作为联合类型的组件,如下所示: (define-type B (U 1 2)) (define (g [b : B]) : B b) 然后(G2)无法进行类型检查,出现类型错误: Type Checker: type mismatch expected: B g

在类型化球拍中,如果我具有以下类型和功能:

(define-type A (U 'one 'two))
(define (f [a : A]) : A
  a)
然后函数调用
(f'one)
类型检查。但是,如果我使用文字数字作为联合类型的组件,如下所示:

(define-type B (U 1 2))
(define (g [b : B]) : B
  b)
然后
(G2)
无法进行类型检查,出现类型错误:

Type Checker: type mismatch
  expected: B
  given: Positive-Byte in: 2
但是,
(g1)
类型检查,因为
1
有自己的类型,
One


我可以用
(g(ann2b))
(或
(g#{2::B})
解决这个问题,但这样做既麻烦又麻烦。这是Typed Racket处理数字类型的基本限制,还是有办法使显式类型注释变得不必要?

(G2)
对我来说很好(Racket 6.1.1)。在6.1.1.2上对我来说很好。同样回到6.0——重写后使用单独的
(:g(B->B))(define(gb)B)
——因为TR当时没有提供自己的
define
。也许你的例子不小心简化得太多了?@GregHendershott-我当时运行的是6.1.0.5,但它不起作用,但是你建议重写以使用
修复了它。我真的很好奇为什么
define
过去总是这样做。@Jack,我不知道。这个问题最好放在Racket邮件列表上,或者放在一些打字的Racket开发者经常光顾的#Racket IRC频道上。