SML:错误:匹配冗余,警告:匹配非穷举

SML:错误:匹配冗余,警告:匹配非穷举,sml,smlnj,Sml,Smlnj,对于此功能,我将获得以下两个问题: fun funion([(x:int list,y:bool list)]) = let fun join(nil,final) = final | join(x::xs,final) = join(xs,union(x,final)) | join(_,final) = final in join([(x,y)],(nil,nil)) end; 以下是错误: sets.sml:30.6-32.27 Error: match redu

对于此功能,我将获得以下两个问题:

fun funion([(x:int list,y:bool list)]) =
let
 fun join(nil,final) = final |
     join(x::xs,final) = join(xs,union(x,final)) |
     join(_,final) = final
in
 join([(x,y)],(nil,nil))
end;
以下是错误:

sets.sml:30.6-32.27 Error: match redundant

(nil,final) => ...

(x :: xs,final) => ...

-->   (_,final) => ...

sets.sml:28.5-35.4 Warning: match nonexhaustive

(x,y) :: nil => ...
有人知道这里发生了什么吗?我也试过加入,但也没用。我不确定这里有什么问题

未捕获异常错误

编辑:

以下是工会的定义:

fun union((w:int list,x:bool list),(y:int list,z:bool list)) =
let
 fun join((nil,nil),final) = final |
     join((w::ws,x::xs),(intfinal,boolfinal)) = if x andalso elementOf(w,(intfinal,boolfinal))=false then join((ws,xs),(w::intfinal,true::boolfinal)) else join((ws,xs),(intfinal,boolfinal)) |
     join(_,final) = final
in
 join((w,x),join((y,z),(nil:int list,nil:bool list)))
end;

我推测
funion
应该有类型

(int list * bool list) list -> (int list * bool list)
但是——您只为长度为1的列表提供了一个定义,它给出了一个非穷举列表警告

对于内部函数
join
,您首先为形式
(nil,final)
的模式提供定义,然后为形式
(x::xs,final)
的模式提供定义。由于第一个组件要么为空,要么与模式
x::xs
匹配,并且任何与
final
匹配的列表都是多余的。也许你想要这三种模式

1)
(无,ys)

2)
(xs,nil)

3)
(xs,ys)


最后一句话——如果你对
union
感到满意——如果你有一个
(int list*bool list)
的列表,那么为什么不把它与
foldl
或者
foldl
一起使用呢?它们的联合是什么呢?

我想
funion
应该有类型的

(int list * bool list) list -> (int list * bool list)
但是——您只为长度为1的列表提供了一个定义,它给出了一个非穷举列表警告

对于内部函数
join
,您首先为形式
(nil,final)
的模式提供定义,然后为形式
(x::xs,final)
的模式提供定义。由于第一个组件要么为空,要么与模式
x::xs
匹配,并且任何与
final
匹配的列表都是多余的。也许你想要这三种模式

1)
(无,ys)

2)
(xs,nil)

3)
(xs,ys)

最后一句话——如果您对
union
感到满意,那么为什么不将其与
foldl
foldl
一起使用呢?如果您有一个
(int list*bool list)
列表以及它们的联合是什么?

“Error:match redundant”意味着一个模式与之前测试的匹配项不匹配。在您的情况下,您有匹配模式
(nil,final)
(它匹配第一个元素为空列表的任何对)和匹配模式
(x::xs,final)
(它匹配第一个元素为非空列表的任何对),它们一起覆盖所有情况。然后你就有了匹配模式
(u,final)
,它不匹配任何新的内容。从技术上讲,这不一定是错误-编译器可以发出警告并放弃此匹配-但这是一个非常严重的警告,SML/NJ将其视为错误

“警告:匹配非穷尽”意味着您的匹配模式并不涵盖所有情况。在您的例子中,匹配模式
([(x:int-list,y:bool-list)])
只能匹配单个元素列表。(您可能只是想编写
(x:int list,y:bool list)
,而不使用
[…]
符号来匹配硬编码长度的列表。)

“错误:匹配冗余”表示模式不匹配先前测试的匹配也不匹配的任何内容。在您的情况下,您有匹配模式
(nil,final)
(它匹配第一个元素为空列表的任何对)和匹配模式
(x::xs,final)
(它匹配第一个元素为非空列表的任何对),它们一起覆盖所有情况。然后你就有了匹配模式
(u,final)
,它不匹配任何新的内容。从技术上讲,这不一定是错误-编译器可以发出警告并放弃此匹配-但这是一个非常严重的警告,SML/NJ将其视为错误


“警告:匹配非穷尽”意味着您的匹配模式并不涵盖所有情况。在您的例子中,匹配模式
([(x:int-list,y:bool-list)])
只能匹配单个元素列表。(您可能只是想编写
(x:int-list,y:bool-list)
,而不使用
[…]
符号来匹配硬编码长度的列表。)

什么是
union
?它既不是由您定义的,也不是标准基础的一部分。另外--您真的打算定义一个只能应用于包含1个元素的列表的函数(
funion
)?我看不出有什么理由要
funion([(x:int-list,y:bool-list)]
而不是
funion(x:int-list,y:bool-list)
。它找到两组整数的并集。funion找到n个集合的并集。因此,我递归地调用当前集合上的join和之前所有集合的并集。如果它是您定义的一部分,您应该包括
union
,并更清楚地解释
funion
的预期输入和输出是什么。我在OP中添加了并集的定义。funion的输入是(int-list*bool-list),它应该返回(int-list*bool-list),这是列表中所有集合的并集。什么是
elementOf
?理想情况下,问题应该是自包含的。什么是
union
?它既不是由您定义的,也不是标准基础的一部分。另外--您真的打算定义函数吗(
funion
)哪个只能应用于包含1个元素的列表?我看不出
funion([(x:int-list,y:bool-list)]
funion(x:int-list,y:bool-list)相反的原因
。我自己声明了并集。它找到了两组整数的并集。funion找到了n个集合的并集。因此,我递归地调用了当前集合上的join和之前所有集合的并集。如果它是定义的一部分,您应该包括
并集,并更清楚地解释预期的inpu是什么t和
funion
的输出是