我试图创建一个函数来模式匹配一个结构,该结构是一个包含值的元组和一个元组的列表
'a * ('b * 'c) list -> 'b list
Run Code Online (Sandbox Code Playgroud)
例如,给出以下内容:
let clubDetails = ("MyClub", [("Secretary", "Jill");("Captain", "Bob");("Email", "Bob@MyClub.com")])
Run Code Online (Sandbox Code Playgroud)
我需要一个函数来返回列表["秘书";"队长";"电子邮件"]
所以我想我可以这样做:
let getClubAttributes ca =
match ca with
| (a, [(b,c)]) -> [b]
| _ -> []
Run Code Online (Sandbox Code Playgroud)
但在这里
getClubAttributes clubDetails
Run Code Online (Sandbox Code Playgroud)
返回空列表.我觉得我错过了一些非常明显的东西.
谢谢,拉塞尔.
您编写的模式匹配表单只有list在元组中只有一个元素时才匹配.
我注意到你_在模式匹配中编写了一个默认大小写,它返回空列表,这就是你要击中的情况.我怀疑你已经添加了这个案例来删除编译器警告,但编译器警告实际上警告你这个确切的问题.
您实际上并不需要模式匹配,因为只能使用一种情况来处理数据结构.
let clubDetails = ("MyClub", [("Secretary", "Jill");("Captain", "Bob");("Email", "Bob@MyClub.com")])
let getClubAttributes (ca, attribList) =
List.map fst attribList
Run Code Online (Sandbox Code Playgroud)
新getClubAttributes函数通过获取列表中每个项目的第一个元素,只是从原始函数创建一个新列表.