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

如何定义相互递归类型?ReasonML递归类型代码报错求助

解决ReasonML中相互递归类型的定义问题

你遇到的问题是因为你的几个类型形成了循环依赖:cellInfo('a)引用了column('a),而column('a)通过cellInfoFn('a)又引用回了cellInfo('a),ReasonML默认的顺序类型声明无法处理这种情况。

先看一下你遇到的错误提示(整理后):

[1] 12 │ type cellInfo('a) = {
[1] 13 │ index: int,
[1] 14 │ column: column('a),
[1] 15 │ id: string
[1] 16 │ };
[1]
[1] This type constructor's parameter cannot be resolved because it refers to a type that hasn't been defined yet.

解决方案:使用and关键字声明相互递归类型

ReasonML提供了and关键字来专门处理这种相互依赖的类型声明,你需要把所有循环依赖的类型放在同一组声明中,用and连接它们,而不是每次都用type开头。

修改后的代码如下:

type cellInfo('a) = {
  index: int,
  column: column('a),
  id: string
}
and cellInfoFn('a) = cellInfo('a) => ReasonReact.reactElement
and column('a) = {
  header: string,
  accessor: accessor('a), // 注意:如果`accessor('a)`也是未定义的递归类型,需要用`and`一起声明
  id: option(string),
  cell: cellInfoFn('a),
};

关键说明

  • and关键字告诉编译器:这些类型是相互依赖的,需要同时解析,而不是按从上到下的顺序逐个处理。
  • 如果accessor('a)也是一个未定义的类型,并且也参与了递归依赖,你需要把它也加入到这个type...and...and的声明链中。

这样修改后,编译器就能正确处理这些相互递归的类型了。

内容的提问来源于stack exchange,提问作者GTDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:24:04