元组列表上的模式匹配

时间:2017-05-30 23:22:11

标签: f#

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

'a * ('b * 'c) list -> 'b list

例如给出以下内容:

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

我需要一个函数来返回列表["秘书&#34 ;;"队长&#34 ;;"电子邮件"]

所以我认为我可以这样做:

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

但是这里

getClubAttributes clubDetails

返回空列表。我觉得我错过了一些非常明显的东西。

谢谢, 罗素。

1 个答案:

答案 0 :(得分:5)

您编写的模式匹配表单只有在元组中的list 完全一个元素时才会匹配。

我注意到你在模式匹配中编写了一个默认的_个案例,它返回空列表,这就是你要击中的情况。我怀疑你已经添加了这个案例来删除编译器警告,但实际上编译器警告警告你这个确切的问题。

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

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

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

新的getClubAttributes函数只是通过获取列表中每个项目的第一个元素,从原始文件中创建一个新列表。