Typed/Racket类型检查报错:cons函数类型不匹配问题咨询
Typed/Racket中
cons类型报错原因 我定义了一个string-split*函数,接收参数s(自定义递归数据类型RecurListofString)和lsep(字符串分隔符列表),输出分割后的RecurListofString。该函数在无类型的Racket中运行正常,但在Typed/Racket中类型检查器持续针对cons报错,具体代码及错误信息如下:
#lang typed/racket (define-type RecurListofString (U String (Listof RecurListofString))) (: string-split* (-> RecurListofString (Listof String) RecurListofString)) (define (string-split* s lsep) (cond [(null? s) '()] [(null? lsep) s] [(string? s) (string-split* (string-split s (car lsep)) (cdr lsep))] [(list? s) (cons (string-split* (car s) lsep) (string-split* (cdr s) lsep))]))
错误信息:
Type Checker: Polymorphic function `cons' could not be applied to arguments: Types: a (Listof a) -> (Listof a) a b -> (Pairof a b) Arguments: RecurListofString RecurListofString Expected result: RecurListofString in: (cons (string-split* (car s) lsep) (string-split* (cdr s) lsep))
错误原因分析
- 类型不匹配:你定义的
RecurListofString是String和(Listof RecurListofString)的联合类型,但cons的返回值不符合这个类型要求。cons的两个重载:要么接收a和(Listof a)返回(Listof a),要么接收任意a和b返回(Pairof a b)。但你传入的第二个参数(string-split* (cdr s) lsep)类型是RecurListofString——它可能是字符串而非列表,既不满足第一个重载的(Listof a)要求,返回的Pairof也不在RecurListofString的定义范围内(你的类型只包含纯字符串或该类型的完整列表,不包含非空pair结构)。
- 递归类型的约束缺失:在Typed/Racket中,
(Listof X)本质是(U Null (Pairof X (Listof X))),但你的RecurListofString只明确包含(Listof RecurListofString),当你用cons组合两个RecurListofString时,类型检查器无法确认第二个参数是合法的列表尾部,自然无法将结果归为RecurListofString类型。
简单来说,你在list? s分支里默认(cdr s)处理后还是列表,但类型检查器无法保证这一点——(string-split* (cdr s) lsep)的返回值可能是字符串,此时cons生成的pair不属于你定义的递归类型。
内容的提问来源于stack exchange,提问作者user32527061
相关产品推荐
相关产品推荐

