如何在Typed Racket中使用eval?解决类型检查报错及结果类型指定问题
问题:Typed Racket中使用
time包裹eval时的类型检查错误 我在启动时添加-I typed/racket参数的REPL中执行了形如(time (eval ......))的表达式,触发了以下类型检查错误:
string:1:0: Type Checker: Polymorphic function `time-apply' could not be applied to arguments: Domains: (-> a ... a b) (List a ... a) (-> b) Null Arguments: (-> AnyValues) Null in: (time (eval ......)) [,bt for context]
我尝试过用cast和assert来指定eval的返回结果数量和类型,但产生了新的错误,请问该如何正确处理?
解决方案
1. 统一eval的返回值为单个值
Typed Racket的time函数要求被包裹的表达式返回单个值,但eval的类型是(-> AnyValues)(可能返回多个值),类型不匹配导致报错。可以用以下方式将多值转换为单值:
- 用
call-with-values把结果打包成列表:(time (call-with-values (λ () (eval ......)) list)) - 若确定
eval仅返回单个值,用let-values直接提取:(time (let-values ([(v) (eval ......)]) v))
2. 为返回值指定具体类型
如果需要严格的类型约束,先处理eval的结果类型,再传入time:
- 用
assert验证类型(以整数为例):(time (let-values ([(v) (eval ......)]) (assert v exact-integer?))) - 用
cast强制类型转换:
这里(time (cast (call-with-values (λ () (eval ......)) (λ (v) v)) exact-integer?))(λ (v) v)确保只接收单个值,再通过cast指定具体类型。
3. 临时绕过类型检查(不推荐)
如果只是临时测试,可通过ann标注类型让检查器通过:
(time ((ann (λ () (eval ......)) (-> Any))))
这种方法会降低类型安全性,仅适合快速验证场景。
内容的提问来源于stack exchange,提问作者Antigen-1
相关产品推荐
相关产品推荐

