SML 中的 If & Else 和模式匹配?

问题描述

我一直在尝试编译这段代码 3 个小时,但没有任何改进。 我知道我的数据类型编译没有问题,也是模式匹配的第一种情况。但是当第二种情况出现时(一个节点有两个子节点),它不会编译。问题似乎符合 if 和 4 条件。

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 有返回类型 unit 而 else boole )

解决方法

我怀疑秘密错误消息是在抱怨第三种情况,因为您在前两种情况下忘记了参数周围的括号 –

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