我想在标准ml中创建一个函数来检查树是否完整,该函数以某种方式工作,但它给了我错误的类型和非详尽情况的警告
树代码:
datatype 'data tree =
EMPTY
| NODE of 'data tree * 'data * 'data tree;
fun isComplete EMPTY = true
| isComplete (NODE(x, y, z)) = if (x = EMPTY andalso z <> EMPTY) orelse (x <> EMPTY andalso z = EMPTY) then false else true;
现在上面函数的类型是:''a tree -> bool
但所需的类型是'a tree -> bool
我的警告是:
stdIn:169.8 Warning: calling polyEqual
stdIn:169.26 Warning: calling polyEqual
stdIn:169.45-169.47 Warning: calling polyEqual
stdIn:169.64-169.66 Warning: calling polyEqual
stdIn:124.1-169.94 Warning: match nonexhaustive
NODE (x,y,z) => ...
我遇到的问题是什么?
编辑:
感谢Michael,我修复了代码,现在它可以运行了:
- fun isComplete EMPTY = true
| isComplete (NODE(EMPTY, _, EMPTY)) = true
| isComplete (NODE(NODE(x, y, z), _, NODE(a, b, c))) = true
| isComplete (EMPTY, _, NODE(x, y, z)) = false
| isComplete (NODE(x, y, z), _, EMPTY) = false;
答案 0 :(得分:0)
关于polyEqual警告:在SML / NJ中,每次使用此运算符时都会打印此警告,但这并不意味着您的代码有问题。这是关于它的博客文章,在评论中有人解释了为什么会发出警告:http://abstractfactory.blogspot.fr/2006/05/sml-hacking-tip-turn-off-polyequal.html
答案 1 :(得分:0)
''a tree -> bool
类型表示a
是相等类型:它必须是支持使用equals进行测试的类型。由于您使用=
和<>
来测试x
和z
,因此树数据必须支持相等(即使您没有对值进行任何有趣的操作)。这是polyEqual
警告的根源。
非穷举匹配警告更令人费解。当我将您的数据类型和函数定义粘贴到Moscow ML时,我 not 会收到警告。我不认为我会担心太多,因为我希望修改类型以处理警告。
要获得所需的类型'a tree -> bool
,我建议删除if
以支持模式匹配。 E.g:
fun isComplete EMPTY = true
| isComplete (NODE(EMPTY, _, EMPTY)) = true
| isComplete (NODE(EMPTY, _, NODE(x,y,z))) = false
| ... (* fill out the rest of the cases *)
我会留给你找出全套案例,因为这看起来像是家庭作业。
顺便说一下,我认为您的完整性测试不正确。考虑当子树都不是EMPTY
时会发生什么:在不考虑内容的情况下调用树完成。但这与您所看到的警告没有任何关系。