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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 09:34:54