SML: Error: match redundant and Warning:match nonexhaustive
SML: Error: match redundant and Warning:match nonexhaustive
我遇到了这个函数的两个问题:
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 => ...
有人知道这里会发生什么吗?我也试过 join(_) 但这也没有用。不知道这里有什么问题。
未捕获的异常错误
编辑:
联合的定义如下:
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 的列表提供定义,这会给出 non-exhaustive 列表警告。
对于内部函数 join
,您首先为 (nil, final)
形式的模式提供定义,然后为 (x::xs,final)
形式的模式提供定义。由于第一个组件为空或匹配模式 x::xs
并且任何列表都匹配 final
,因此任何进一步的模式都是多余的。也许你想要三种模式
1) (nil,ys)
2) (xs,nil)
3) (xs,ys)
最后一句话——如果你对 union
感到满意——如果你有 (int list * bool list)
的列表,为什么不直接将它与 foldl
或 foldl
一起使用它们的结合是什么?
"Error: match redundant" 表示模式不匹配任何 previously-tested 匹配也不会匹配的内容。在您的情况下,您有 match-pattern (nil, final)
(匹配第一个元素为空列表的任何对)和 match-pattern (x::xs, final)
(匹配第一个元素的任何对是一个 non-empty 列表),它们一起涵盖了所有情况。 . .然后你有 match-pattern (_, final)
,它不匹配任何新内容。从技术上讲,这不一定是错误 - 编译器可以发出警告并丢弃此匹配项 - 但这是一个非常严重的警告,SML/NJ 将其视为错误。
"Warning: match nonexhaustive" 表示您的 match-pattern 并未涵盖所有情况。在您的情况下, match-pattern ([(x:int list,y:bool list)])
只能匹配 single-element 列表。 (你可能只是想写 (x:int list, y:bool list)
,没有 [...]
符号来匹配硬编码长度的列表。)
我遇到了这个函数的两个问题:
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 => ...
有人知道这里会发生什么吗?我也试过 join(_) 但这也没有用。不知道这里有什么问题。
未捕获的异常错误
编辑:
联合的定义如下:
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 的列表提供定义,这会给出 non-exhaustive 列表警告。
对于内部函数 join
,您首先为 (nil, final)
形式的模式提供定义,然后为 (x::xs,final)
形式的模式提供定义。由于第一个组件为空或匹配模式 x::xs
并且任何列表都匹配 final
,因此任何进一步的模式都是多余的。也许你想要三种模式
1) (nil,ys)
2) (xs,nil)
3) (xs,ys)
最后一句话——如果你对 union
感到满意——如果你有 (int list * bool list)
的列表,为什么不直接将它与 foldl
或 foldl
一起使用它们的结合是什么?
"Error: match redundant" 表示模式不匹配任何 previously-tested 匹配也不会匹配的内容。在您的情况下,您有 match-pattern (nil, final)
(匹配第一个元素为空列表的任何对)和 match-pattern (x::xs, final)
(匹配第一个元素的任何对是一个 non-empty 列表),它们一起涵盖了所有情况。 . .然后你有 match-pattern (_, final)
,它不匹配任何新内容。从技术上讲,这不一定是错误 - 编译器可以发出警告并丢弃此匹配项 - 但这是一个非常严重的警告,SML/NJ 将其视为错误。
"Warning: match nonexhaustive" 表示您的 match-pattern 并未涵盖所有情况。在您的情况下, match-pattern ([(x:int list,y:bool list)])
只能匹配 single-element 列表。 (你可能只是想写 (x:int list, y:bool list)
,没有 [...]
符号来匹配硬编码长度的列表。)