You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何`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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:45:36