检查树是否完全标准ml

时间:2012-03-29 14:57:59

标签: function types tree sml ml

我想在标准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;

2 个答案:

答案 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进行测试的类型。由于您使用=<>来测试xz,因此树数据必须支持相等(即使您没有对值进行任何有趣的操作)。这是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时会发生什么:在不考虑内容的情况下调用树完成。但这与您所看到的警告没有任何关系。