Прежде чем взглянуть на ошибки во время выполнения, лучше сначала взглянуть на выходные данные компилятора (то есть предупреждения).
У вас есть два предупреждения.Первый:
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 (_,_,_)
.
Вы можете показать компилятору, что все N (_,_,_)
обрабатываются, удалив второе предложение when
(то есть when absolute (node g - node d) <= 1
).Сопоставление с образцом не достигнет этой точки, если это предложение не является истинным, поэтому вы можете быть уверены, что это так.Кроме того, вы убедитесь, что вы не повторяете одно и то же вычисление дважды таким образом.Обратите внимание, что и в этом сопоставлении с образцом вы не обрабатывали случай Empty
снова.Сделайте это.
Теперь давайте рассмотрим ваше исключение.В основном это говорит: «Сопоставление с образцом в строке 8, символ 15 не удался».Это ваша node
функция.Где вы были предупреждены, что ваше сопоставление с образцом было неполным.Урок здесь: «Не игнорируйте предупреждения, они не надоедают, они важны».