我假设你设置的模块被称为TSet
,并且你正在使用OCaml标准库集。我还假设你的设置并不是真的叫做T
,因为它不是OCaml变量的有效名称。
如果你只关心一个是/否的答案是否存在一个匹配的值,你可以这样做:
let result =
TSet.exists
(function
| 4, _, 5 -> true
| _ -> false)
t in
if result then print_endline "yes" else print_endline "no"
在一般情况下,无论您的谓词是,你可以做
TSet.exists p t
如果你想要的不仅仅是一个yes/no的答案,并且希望能够在集合中的所有匹配值的情况下对分支进行任意计算,那么必须使用fold
或iter
模式匹配。例如,如果你想所有的第一整数加在一起,但只有当最后一个整数是5:
TSet.fold
(fun element accumulator ->
match element with
| x, _, 5 -> x + accumulator
| _ -> accumulator)
t 0
如果你想只有第一个匹配的元素上执行计算,你可以做空除了电路评估外。例如:
exception Found of int
try
TSet.iter
(function
| x, _, 5 -> raise_notrace (Found x)
| _ ->())
t;
None
with Found x -> Some x
这最后一个是尴尬的键入一遍又一遍。您可以编写一个多态函数来解决使用参考和内置的Exit
异常来解决自己的模式匹配搜索短路问题。我将把它作为一个练习。
使用raise_notrace
是个好主意,因为这个异常用于正常流量控制。如果您的程序在启用堆栈跟踪的情况下编译了一天,那么在抛出异常时raise_notrace
将省略堆栈跟踪,如果经常调用该函数,则可能会使程序更快。
供您参考,http://caml.inria.fr/pub/docs/manual-ocaml/libref/Set.S.html
你似乎匹配要只匹配它的元素之一整套吨。 –
@Sheeft是的。有没有其他的方式比从T列表中,然后检查列表中的每个元素的这种方式? –