Skip to content

feat(typecheck): native 签名与用户模块统一 — 裸 List/Result 应按泛型推断(#242 遗留) #249

Description

@ChenXu233

背景

#242 已把 std NativeExport.signature 字符串解析为真实 MonoType,但裸容器被固定解析为 Any 实参(signature.rs"List" => MonoType::List(Any) 分支)。这造成 native 模块与用户定义的 yx 模块类型语义不一致

用户模块里 (list: List) 等价于隐式泛型 (list: List(T)),调用时从实参推断 T;native 模块里裸 List 却是固定的 List(Any),且当前类型系统无协变/隐式提升,导致具体类型列表无法传入

复现

use std.list
use std.result
use std.string

main = {
    n = list.len([1, 2, 3])          # E1002: Expected 'List(Any)', found 'List(int64)'
    items = [1, 2, 3]
    out = list.get(items, 0)         # E1002 同上
    r = string.parse_int("abc")      # Result(Int, Error)
    ok = result.is_err(r)            # E1002: Expected 'Result(T, E)', found 'Result(int64, Error)'
}

map/filter/reduce 用显式 [T] 前缀可正常工作——证明解析器支持泛型,只是裸容器分支走错了路。

目标

native 签名解析与用户 yx 模块无区别:裸 List/Result/Dict 等容器应解析为带类型变量的泛型(调用点推断),而非固定 Any。修好后 list.len([1,2,3])result.is_err(r) 均应通过类型检查。

影响

  • SPEC §1.3(Result 方法)、§5.1(List 方法)承诺的 API 目前无法以规范写法调用
  • 阻塞 标准库各模块单元测试覆盖 #117(std 模块单元测试覆盖)——错误路径(parse 失败、越界)全靠这些方法表达

涉及文件

  • src/frontend/core/typecheck/signature.rs — 裸容器分支("List" => List(Any) 等)
  • 可能的修复路径 A:std 签名改 [T] 显式泛型(局部、有先例);路径 B:typecheck 裸容器按隐式泛型推断(系统级,与用户模块语义统一)

关联

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-typecheckType checking and type systemC-featureA feature request or enhancementP2Medium priority — important but not urgent

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions