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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:35:27