2016-01-23 43 views
1

我得到了这两个问题对于这个功能:SML:错误:匹配冗余和警告:符合非排他性

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; 
+1

什么是'union'?它既不是由您定义的,也不是标准基础的一部分。另外 - 它是否真的打算定义一个函数('funion'),它只能应用于一个具有1个元素的列表?我没有看到'funion([(x:int list,y:bool list)])'与'funion(x:int list,y:bool list)'相对的任何理由。 –

+0

我自己宣布工会。它找到两组整数的联合。funion找到n个集合的联合。所以我递归地调用当前集合上的连接以及之前所有集合的连接。 – user3685346

+1

如果它是你定义的一部分,你应该包括'union',并且更加清楚地解释'funion'的输入和输出是什么。 –

回答

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 - 为什么不只是使用它foldlfoldl如果你有一个(int list * bool list)的列表以及它们的组合是什么?

+0

非常感谢您的帮助。至于我为什么不使用foldl,这是因为这是我班的任务。 – user3685346

1

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

“警告:非排他性匹配”意味着您的匹配模式不涵盖所有情况。在你的情况下,匹配模式([(x:int list,y:bool list)])只能匹配单个元素列表。 (您可能只是想写(x:int list, y:bool list),没有[...]表示法来匹配硬编码长度列表。)