为何`integer?`并非仅对Integer类型返回成功?代码为何无法类型检查?
Typed/Racket中
integer?无法通过类型检查的原因 Typed/Racket采用静态类型检查机制,它不会依赖运行时的integer?判断结果推导变量类型,而是在编译阶段基于变量的声明类型做分析:
- 变量
x被声明为Real类型,这个类型涵盖整数和非整数两类值。 - 即便用
integer?做了分支判断,编译器在静态检查阶段无法确定该分支下的x一定是Integer类型,因此不允许直接将x赋值给Integer类型的y。
解决方法
使用assert类型断言明确告知编译器,该分支下的x符合Integer类型:
(define x : Real 134) (define y : Integer (cond [(integer? x) (assert x integer?)] [else (error "not an integer")]))
如果不需要自定义错误提示,也可以简化为:
(define x : Real 134) (define y : Integer (assert x integer?))
assert会自动在类型不匹配时抛出错误,替代了手动的cond分支判断。
内容的提问来源于stack exchange,提问作者John Clements
相关产品推荐
相关产品推荐

