找到一个子集,但F#不会让我比较两组不同的长度

时间:2014-05-11 00:24:40

标签: f#

我试图找出一组是否是另一组的子集。如果两个集的长度相同,我的代码就可以正常工作。

例如,

如果

,我的代码将返回true

x = [a; b; c] y = [a; b; c]

如果

,我的代码将返回false

x = [a; b; c] y = [a; b; d]

但是,如果我尝试

,我的代码甚至都不会编译

x = ['a';'b';'c'] y = ['a';'b';'c';'d']

它应该返回true,但是我收到以下错误消息:

Type mismatch. 
Expecting a Set<char * char * char> but given a Set<char * char * char * char> 

The tuples have differing lengths of 3 and 4

我的代码在

下面
let mySubList x y =
printfn "%A is a proper subset of %A: %b" x y (Set.isSubset x y)

let x = Set.empty.Add('a','b','c')
let y = Set.empty.Add('a','b','c', 'd')
let z = Set.empty.Add('a','x','a','y','c','e')

let found = mySubList x y

1 个答案:

答案 0 :(得分:8)

所有集合都包含相同数量的元素:它们都只包含一个元素。但是它们包含不同类型的元素,这就是您无法比较的原因。即x包含3元组(char * char * char),y包含4元组,z包含5元组。

这里要注意的重要一点是Add('a', 'b', 'c')没有用多个参数调用Add - 它用一个参数调用它,这是一个元组。这将向集合添加单个元组元素。要添加多个元素,请多次使用Add,或者只使用列表中的set(即set ['a'; 'b'; 'c'])而不是Add来避免多个函数调用。