SML:错误:匹配冗余和警告:匹配nonexhaustive

时间:2016-01-23 00:02:37

标签: 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 redundant

(nil,final) => ...

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

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

sets.sml:28.5-35.4 Warning: match nonexhaustive

(x,y) :: nil => ...

有谁知道这里会发生什么?我也试过加入(_),但这也没有用。不知道这里有什么问题。

未捕获的异常错误

编辑:

这是union的定义:

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;

2 个答案:

答案 0 :(得分:2)

我认为funion应该有类型

(int list * bool list) list -> (int list * bool list)

但是 - 你只提供长度为1的列表的定义,它给出了一个非详尽的列表警告。

对于内部函数join,首先为表单(nil, final)的模式提供定义,然后为表单(x::xs,final)的模式提供定义。由于第一个组件为空或匹配模式x::xs以及任何匹配final的列表,因此任何进一步的模式都是多余的。也许你想要三种模式

1)(nil,ys)

2)(xs,nil)

3)(xs,ys)

最后评论 - 如果您对union感到满意 - 如果您有foldl的列表,那么为什么不将它与foldl(int list * bool list)一起使用?他们的联盟呢?

答案 1 :(得分:2)

"错误:匹配冗余"意味着一个模式不匹配以前测试的匹配也不匹配的任何东西。在您的情况下,您具有匹配模式(nil, final)(匹配其第一个元素为空列表的任何对)和匹配模式(x::xs, final)(匹配其第一个元素为非的任何对空列表),它们共同涵盖所有案例。 。 。然后你有匹配模式(_, final),它不匹配任何新东西。从技术上讲,这不是一个错误 - 编译器只能发出警告并丢弃这个匹配 - 但它是一个严重的警告SML / NJ将其视为错误。

"警告:匹配非穷举"意味着您的匹配模式并不涵盖所有情况。在您的情况下,匹配模式([(x:int list,y:bool list)])只能匹配单个元素列表。 (您可能只是想写(x:int list, y:bool list),而没有[...]符号来匹配硬编码长度列表。)