If & Else & Pattern Matching в SML все вместе?
Я пытался скомпилировать этот фрагмент кода в течение 3 часов, и ничего не улучшилось. Я знаю, что мой тип данных компилируется без проблем, а также первый случай сопоставления с образцом. Но когда приходит второй случай (узел с двумя узлами для детей), он не компилируется. Проблемы, похоже, соответствуют условию if и четырем условиям.
datatype Heap = Leaf of int
|Node of int * Heap * Heap
(*.........................................*)
fun isHeap Leaf(a) = true
| isHeap Node(a,Leaf(b),Leaf(c)) = if (a<=b andalso a<=c) then true
else false
| isHeap (Node(a, Node(b,_,_), Node(c,_,_)) )=
if(a<= c andalso a<=b andalso isHeap (Node(b,_,_)) andalso isHeap (Node(c,_,_)) )
then true
else false
Я попытался сделать это по-другому, разбив четыре условия на
let
val left = isHeap (Node(b,_,_))
val right = isHeap (Node(c,_,_))
in
if(left = true andalso right = true) then true
else false
end
else false
Это тоже работает (я думаю, потому что let in имеет возвращаемый тип, а еще логическое)
1 ответ
Я подозреваю, что секретное сообщение об ошибке касается третьего случая, потому что вы забыли скобки вокруг параметра в первых двух случаях -
isHeap Leaf(a)
эквивалентно
isHeap Leaf a
который имеет два параметра, а второй случай также имеет два параметра,
Node
а также
(a,Leaf b,Leaf c)
.
Кроме того, вы пытаетесь использовать
_
как выражение, чего вы не можете.
Вместо того, чтобы пытаться исправить это (ваша функция станет очень утомительной и нечитаемой после добавления двух отсутствующих случаев), я предлагаю ввести вспомогательную функцию:
fun value (Leaf v) = v
| value (Node (v, _, _)) = v
а затем вы можете упростить код до
fun isHeap (Leaf _) = true
| isHeap (Node (v, left, right)) = v <= value left
andalso v <= value right
andalso isHeap left
andalso isHeap right