SML 中的 If & Else & 模式匹配一起吗?
If & Else & Pattern Matching in SML alltogether?
我已经尝试编译这段代码 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 有 return 类型的单元,而 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
我已经尝试编译这段代码 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 有 return 类型的单元,而 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