【发布时间】:2020-04-09 19:20:22
【问题描述】:
我正在尝试实现一个二叉树,其中每个节点都可以保存'a 类型或'b 类型的信息。简单的解决方案是使用 2 个这样的构造函数:
datatype ('a, 'b) Tree = Lf
| Br1 of 'a * (('a, 'b) Tree) * (('a, 'b) Tree)
| Br2 of 'b * (('a, 'b) Tree) * (('a, 'b) Tree);
Br1(100,Lf,Br2("hello",Lf,Lf));
>val it = Br1 (100, Lf, Br2 ("hello", Lf, Lf)): (int, string) Tree;
但是,我想使用 1 个构造函数,因此结果如下:
Br(100,Lf,Br("hello",Lf,Lf));
>val it = Br (100, Lf, Br ("hello", Lf, Lf)): (int, string) Tree;
模式匹配似乎不起作用,它在调用 Br 时返回一个长类型冲突错误:
datatype ('a, 'b) Tree = Lf
| Br of 'a * (('a, 'b) Tree) * (('a, 'b) Tree)
| Br of 'b * (('a, 'b) Tree) * (('a, 'b) Tree);
我感觉它与联合数据类型有关,所以我尝试了以下方法,但是当我尝试像这样调用 Br 时,它给出了一个错误:
local
datatype ('a,'b) u = t1 of 'a
| t2 of 'b;
in
datatype ('a, 'b) Tree = Lf
| Br of ('a,'b) u * (('a, 'b) Tree) * (('a, 'b) Tree);
end;
Br(100,Lf,Br("hello",Lf,Lf));
Elaboration failed: Unbound type "u".
可能是语法不对,还是我的想法不对?
【问题讨论】:
标签: tree binary-tree sml