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

Posted

技术标签:

【中文标题】If & Else & SML 中的模式匹配?【英文标题】:If & Else & Pattern Matching in SML alltogether? 【发布时间】:2021-09-01 09:44:29 【问题描述】:

我已经尝试编译这段代码 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)

【问题讨论】:

下划线_只能作为“通配符”出现在模式中。 您还放错了括号,错过了包含一个Node 和一个LeafNode 的情况,并且编写了过于复杂的布尔表达式。 (if c then true else falsec,和if a = true andalso b = true then true else falsea andalso b。) 【参考方案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

【讨论】:

所以问题是,对于 sml,我的数据类型 Node(b,_,_) 类似于“复合”,所以我无法立即提取 v 的值? 我认为主要问题是您假设括号用于围绕参数列表,就像在其他语言中一样。 我知道在 else 中,例如 sml 只需要看到一条指令,因此我们需要括号来处理它,但这里不是这种情况。你能再详细一点吗? 我不明白你在说什么。 SML 中没有指令,只有表达式。

以上是关于If & Else & SML 中的模式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

ES6中用&&与||来简化if{}else{}写法

在 C# 中使用带有多个 if 语句的 else

如何在 Python 中编写 if-else 条件(Google App Engine)

利用if-else语句实现成绩对应的等级

if . else .if else 的使用

v-if & v-else & v-show