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
Другие вопросы по тегам