致命错误: 异常 Match_failure( "main.ml" , 8, 15)



这是我的代码:

type 'a tree = Empty | N of 'a * 'a tree * 'a tree

let absolute x = 
if x > 0 then x 
else -x
let rec node = function 
| N(_, Empty, Empty) -> 1
| N(_, g, d) -> 1 + node g + node d
let rec balanced = function 
| N(_, Empty, Empty) -> 0
| N(_,g,d) when absolute (node g - node d) > 1 -> 1
| N(_,g,d) when absolute (node g - node d) <= 1 -> balanced g + balanced d

let () = print_int (balanced (N ('x', N ('x', Empty, Empty),
N ('x', N ('x', Empty, Empty), Empty))))

然后它告诉我:

Fatal error: exception Match_failure("main.ml", 8, 15)

我不明白这是什么意思,它似乎并没有表明我的错误来自哪里。

此外,我收到以下警告:

File "main.ml", line 8, characters 15-93:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
Empty
File "main.ml", line 12, characters 19-190:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
(N (_, Empty, N (_, _, _))|N (_, N (_, _, _), _)|Empty)
(However, some guarded clause may match this value.)

如何摆脱此警告?

我的意思是,根据我的说法,说我错过了N(_,_,_)的情况没有任何意义,但是这种情况总是被处理的,那么为什么编译器告诉我这种情况不匹配呢?

在查看运行时错误之前,最好先查看编译器输出(即警告(。

您有两个警告。第一个:

File "main.ml", line 8, characters 15-93:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
Empty

在这里,它告诉我们您在node函数中的模式匹配无法处理Empty情况。只需在模式匹配中添加一个| Empty -> 0,您应该很好(顺便说一下,您不再需要不完整的Node (_,Empty,Empty)案例(。

现在你的第二个警告有点棘手:

File "main.ml", line 12, characters 19-190:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
(N (_, Empty, N (_, _, _))|N (_, N (_, _, _), _)|Empty)
(However, some guarded clause may match this value.)

在这里,它告诉几个模式不匹配,但某些值受到保护。事实上,N (_,_,_)的情况也是如此。

您可以通过删除第二个when子句(即when absolute (node g - node d) <= 1(向编译器显示所有N (_,_,_)都已处理。除非此子句为 true,否则模式匹配不会达到这一点,因此您可以确定它是。此外,请确保不会以这种方式重复两次相同的计算。请注意,在此模式匹配中,您也没有再次处理Empty情况。这样做。

现在让我们来看看你的例外。它基本上说"第 8 行字符 15 的模式匹配失败"。这就是你的node功能。警告您模式匹配不完整的地方。这里的教训是"不要忽视警告,它们并不麻烦,它们很重要"。

警告没有错。您缺少一个案例,编译器已为您生成了该案例的示例。这种情况在运行时出现,因此你得到的匹配失败,因为你没有处理它。

其他人已经解释了警告及其含义。遵循它。

我只想添加一些关于您的代码当前失败的地方。在平衡函数中,您可以捕获左子项和右子项都为空的情况,并正确处理两个子项都不是空的情况。但是,如果只有一个孩子是空的呢?在这种情况下,您可以计算node gnode d。其中之一是空,这是您在节点函数中未涵盖的情况。您的示例确实有节点,其中只有一侧为空,并且在那里失败。

相关内容

  • 没有找到相关文章

最新更新