我正在尝试创建一个函数来匹配一个结构,该结构是一个包含值的元组和一个元组列表
'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
返回空列表。我觉得我错过了一些非常明显的东西。
谢谢, 罗素。
答案 0 :(得分:5)
您编写的模式匹配表单只有在元组中的list
完全一个元素时才会匹配。
我注意到你在模式匹配中编写了一个默认的_
个案例,它返回空列表,这就是你要击中的情况。我怀疑你已经添加了这个案例来删除编译器警告,但实际上编译器警告警告你这个确切的问题。
您实际上并不需要模式匹配,因为只能使用一种情况来处理数据结构。
let clubDetails = ("MyClub", [("Secretary", "Jill");("Captain", "Bob");("Email", "Bob@MyClub.com")])
let getClubAttributes (ca, attribList) =
List.map fst attribList
新的getClubAttributes
函数只是通过获取列表中每个项目的第一个元素,从原始文件中创建一个新列表。