如何解决在列表中的任何位置对特定元素进行模式匹配的最佳方法是什么?
说我有一些清单
["a"; "b"; "d"]
["a"; "c"; "d"]
元素可以按任何顺序排列。列表将包含 "b"
或 "c"
之一,但不会同时包含两者。
如果 "b"
在列表中,我想返回一个特定的值,如果 "c"
在列表中,我想返回一个不同的值。
我是 OCaml 的新手,但据我所知这是不可能通过模式匹配实现的,还是我错过了什么?
这样做最惯用的方法是什么?
解决方法
如果我理解正确,您会看到一个未知列表,您知道该列表包含 "b"
或 "c"
,但不能同时包含两者,您想确定是哪种情况。甚至可能找到第一次出现的位置?
这是一个有趣的问题。首先,您当然可以手动编写循环:
let rec find_b_or_c i = function
| [] -> raise Not_found (* assumed not to happen ? *)
| (("b"|"c") as x) :: _ -> (i,x)
| _ :: xs -> find_b_or_c (i+1) xs
in
let (i,x) = find_b_or_c 0 my_list in
(* … do something with the index and/or the letter
(for instance test whether x = "b") … *)
那么问题是,是否可以通过结合现有功能来更简洁/优雅地编写它。如果您对索引不感兴趣,您可以简单地使用 List.find
或其变体返回一个选项:
let x = List.find (fun x -> x = "b" || x = "c") my_list in (* … *)
您还可以使用 "b"
(或更普遍的 List.mem
)测试 List.exists
的成员资格;然而,使用这种方法,只要列表包含 "c"
(一个非常长的列表,开头有 "c"
但没有 "b"
,你会浪费很多时间)
然而,没有办法用 the standard functions 获取索引,因为它们都没有返回索引。这是故意的,因为列表索引很慢(线性时间),你不应该这样做。如果您真的想要索引,则必须使用上面的手动递归,或者编写一个更通用的函数 find_with_index
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。