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

MrP*_*le5 2 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
Run Code Online (Sandbox Code Playgroud)

我的代码如下

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
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 8

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

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