Typed Racket中for*/list类型检查报错:返回值数量不符
Typed Racket 可扩展词法分析器类型错误修复
你遇到的类型错误根源是 in-indexed 返回两个值(索引与对应字符),而 Typed Racket 的 for*/list 在处理这种多值循环变量绑定时,类型检查器无法准确确认值的数量,从而抛出报错。
修正方案一:替换多值遍历方式
通过显式遍历索引+取字符的方式,避免多值绑定带来的类型推断问题:
#lang typed/racket (define-type Indexed-String (Pairof Index String)) (: lex (-> String (Listof (-> Char Index (Option Indexed-String))) (Listof Indexed-String))) (define (lex text lf) (for*/list ([i (in-range (string-length text))] [c (in-value (string-ref text i))] [f lf] [r (in-value (f c i))] #:when r) r))
修正方案二:显式标注多值类型
如果坚持使用 in-indexed,可以通过显式标注返回值类型,让类型检查器正确识别绑定变量:
#lang typed/racket (define-type Indexed-String (Pairof Index String)) (: lex (-> String (Listof (-> Char Index (Option Indexed-String))) (Listof Indexed-String))) (define (lex text lf) (for*/list ([(c i) : (Values Char Index) (in-indexed text)] [f lf] [r (in-value (f c i))] #:when r) r))
关键修改说明
- 去掉了不必要的
(cast i Index):in-range基于string-length的结果,i本身就是合法的Index类型(非负整数) - 简化
#:when条件为#:when r:利用Option类型的布尔语义,直接判断是否为有效匹配结果
内容的提问来源于stack exchange,提问作者user32527061
相关产品推荐
相关产品推荐

