【问题标题】:check if a tree is complete standard ml检查一棵树是否是完整的标准 ml
【发布时间】:2012-04-13 06:07:24
【问题描述】:

我想在标准 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 -&gt; bool,但是需要的类型是'a tree -&gt; 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;

【问题讨论】:

  • 那个 EDIT 代码仍然不正确。它不是递归的。左边和右边的那些节点可能不完整。

标签: function types tree sml ml


【解决方案1】:

关于 polyEqual 警告:在 SML/NJ 中,每次使用此运算符时都会打印此警告,但这并不意味着您的代码有问题。这是一篇关于它的博客文章,在 cmets 中有人解释了为什么给出警告:http://abstractfactory.blogspot.fr/2006/05/sml-hacking-tip-turn-off-polyequal.html

【讨论】:

  • 好的,但是匹配非穷举呢,我错过了哪些案例?
【解决方案2】:

''a tree -&gt; bool 类型表明a 是一个相等类型:它必须是支持用equals 进行测试的类型。由于您使用=&lt;&gt; 来测试xz,因此树数据必须支持相等性(即使您没有对这些值做任何有趣的事情)。这是polyEqual 警告的根源。

非详尽的匹配警告更令人费解。当我将您的数据类型和函数定义粘贴到莫斯科 ML 时,我确实没有收到警告。我认为我不会太担心它,因为我希望修复类型也能处理警告。

要获得所需的类型'a tree -&gt; bool,我建议去掉if 以支持模式匹配。例如:

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 时会发生什么:您称树完成而不考虑内容。不过,这与您看到的警告无关。

【讨论】:

  • 我正在使用 SML/NJ 我不知道是不是因为我正在使用它,所以我收到了警告。无论如何,感谢您提供的提示,我现在将处理它谢谢迈克尔
  • @aizen92 我没有安装 SML/NJ,所以很遗憾我无法在那里进行测试。当您考虑到ifandalsoorelse 实际上只是模式匹配的特殊情况时,SML/NJ 和 MosML 似乎只是将if 表达式转换为具有不同结构的模式匹配,只有一个其中是详尽的。基本结论:支持模式匹配!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2016-01-24
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多