如何定义相互递归类型?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
相关产品推荐
相关产品推荐

