F# 元组列表上的模式匹配

F# 元组列表上的模式匹配,f#,F#,我试图创建一个函数来匹配一个结构,该结构是一个元组,包含一个值和一个表单的元组列表 'a * ('b * 'c) list -> 'b list 例如: let clubDetails = ("MyClub", [("Secretary", "Jill");("Captain", "Bob");("Email", "Bob@MyClub.com")]) 我需要一个函数来返回列表[“秘书”;“船长”;“电子邮件”] 所以我想我可以这样做: let getClubAttributes ca

我试图创建一个函数来匹配一个结构,该结构是一个元组,包含一个值和一个表单的元组列表

'a * ('b * 'c) list -> 'b list
例如:

let clubDetails = ("MyClub", [("Secretary", "Jill");("Captain", "Bob");("Email", "Bob@MyClub.com")])
我需要一个函数来返回列表[“秘书”;“船长”;“电子邮件”]

所以我想我可以这样做:

let getClubAttributes ca = 
        match ca with
        | (a, [(b,c)]) -> [b]
        | _ -> []
但是这里

getClubAttributes clubDetails
返回空列表。我觉得我错过了一些很明显的东西

谢谢,
Russell。

只有当元组中的
列表
只有一个元素时,您编写的模式匹配表单才会匹配

我注意到,您在模式匹配中编写了一个默认的
\uuu
大小写,它返回空列表,这就是您要命中的大小写。我怀疑您添加此案例是为了删除编译器警告,但编译器警告实际上是在警告您这个确切的问题

实际上,您不需要模式匹配,因为您的数据结构只能处理一种情况

let clubDetails = ("MyClub", [("Secretary", "Jill");("Captain", "Bob");("Email", "Bob@MyClub.com")])

let getClubAttributes (ca, attribList) =
    List.map fst attribList

新的
getClubAttributes
函数通过获取列表中每个项目的第一个元素,简单地从原始列表创建一个新列表。

是的,您的匹配列表只有一个值,我的意思是,如果您的列表是这样的-
(“MyClub”,“Secretary”,“Jill”)
,那么,如果你想写
让getClubAttributes=snd>>List.map fst
很高兴能帮上忙,你应该加入-这是学习F的好地方#