F#从元组列表中提取元组

F#从元组列表中提取元组,f#,F#,我有一个客户端列表,它由字符串*int*字符串*int*字符串列表组成。我做了一个函数,其中我给出了一个string、一个int和一个字符串列表。给定一些规则,我从列表中提取正确的元组 三个客户端的示例: let client1 = "Jon", 37514986, "Male", 1980, ["Cars"; "Boats"; "Airplanes"] let client2 = "Jonna", 31852654, "Female", 1990, ["Makeup"; "Sewing"; "

我有一个
客户端列表
,它由
字符串*int*字符串*int*字符串列表
组成。我做了一个函数,其中我给出了一个
string
、一个
int
和一个
字符串列表
。给定一些规则,我从列表中提取正确的元组

三个
客户端的示例:

let client1 = "Jon", 37514986, "Male", 1980, ["Cars"; "Boats"; "Airplanes"]
let client2 = "Jonna", 31852654, "Female", 1990, ["Makeup"; "Sewing"; "Netflix"]
let client3 = "Jenna", 33658912, "Female", 1970, ["Robe Swinging"; "Llamas"; "Music"]
let file1   = [client1; client2; client3]

//Response must be client(s) with different sex, age diff <= 10 and least one common interest
let request (sex:string) (yob:int) (interests:string list) =
    Set.fold (fun x (nm,ph,sx,yb,toi) -> if sex<>sx && 
                                            yb-yob < 10
                                            then (nm,ph,sx,yb,toi) else x) ("",0,"",0,[]) (Set.ofList file1)

request "Male" 1976 ["Paper"; "Llamas"; "Space"] //Expected ("Jenna", 33658912, "Female", 1970, ["Robe Swinging"; "Llamas"; "Music"])
let client1=“Jon”,37514986,“男性”,1980年,[“汽车”、“船”、“飞机”]
let client2=“Jonna”,31852654,“女性”,1990年,[“化妆”;“缝纫”;“Netflix”]
let client3=“Jenna”,33658912,“女性”,1970年,[“长袍摆动”;“骆驼”;“音乐”]
让file1=[client1;client2;client3]
//回答必须是不同性别、年龄差异(如果是性别)的客户
yb-yob<10
然后(nm,ph,sx,yb,toi)else x(“”,0,“”,0,[])(Set.of列表文件1)
请求“男”1976[“纸”;“骆驼”;“空间”]//预期(“珍娜”,33658912,“女”,1970年,[“长袍摆动”;“骆驼”;“音乐”])
所以,我想你可以称之为约会局。在上面的示例中,我请求所有客户,这些客户与我的性别不同,并且年龄差异不超过10岁。到目前为止,我没有使用
兴趣
,因为我仍在使用它,但它应该比较给定的兴趣和
客户端的interets
,看看是否至少有一个相似之处

但我目前的问题是,它在第一个兼容的客户端停止并返回,但是如果还有更多呢?如何使其继续并建立一组客户


我试图用
Set
做一些事情,因此列表的
Set.ofList
,但不知何故,我觉得像现在这样使用
Set
没有任何好处。

当使用n元组(这里是五元组)和n>3或非唯一类型时,我总是感到困惑。记录更容易理解:

type Sex = Male | Female
type Client = { name: string; id: int; sex: Sex; YearOfBirth: int; interests: Set<string> }
如果确实需要在代码中列出许多值,请创建一个帮助器函数(或构造函数),将元组映射到记录。 过滤列表时,您可以只匹配所需的值(请注意,
name
未使用):

让我们请求你的性兴趣=
文件1
|>List.filter(fun{sex=s;birth=y;interests=i}->
性s&abs(yob-y)集合。相交兴趣|>(未集合。列表)
val it:客户端列表=
[{name=“Jenna”;
id=33658912;
性别=女性;
出生年份=1970年;
兴趣=设置[“骆驼”;“音乐”;“长袍摆动”];}]


你看了
列表.过滤器了吗?
let client1 = { name = "Jon"; id = 37514986; sex = Male; YearOfBirth = 1980; interests = ["Cars"; "Boats"; "Airplanes"] |> Set.ofList }
let client2 = { name = "Jonna"; id = 31852654; sex = Female; YearOfBirth = 1990; interests = ["Makeup"; "Sewing"; "Netflix"] |> Set.ofList }
let client3 = { name = "Jenna"; id = 33658912; sex = Female; YearOfBirth = 1970; interests = ["Robe Swinging"; "Llamas"; "Music"] |> Set.ofList }
let file1   = [client1; client2; client3]
let request sex yob interests =
    file1
    |> List.filter (fun { sex = s; YearOfBirth = y; interests = i } ->
        sex <> s && abs(yob-y)<= 10 && i |> Set.intersect interests |> (not << Set.isEmpty))

request Male 1976 (["Paper"; "Llamas"; "Space"] |> Set.ofList)