如何解决find_first 函数如何用于 OCaml 集?
我很难理解为什么下面的代码没有找到任何匹配的结果:
module IntPairs =
struct
type t = int * int
let compare (x0,y0) (x1,y1) =
match Stdlib.compare x0 x1 with
0 -> Stdlib.compare y0 y1
| c -> c
end
module PairsSet = Set.Make(IntPairs)
let m2 = PairsSet.(empty |> add (2,0) |> add (1,2) |> add (0,1))
let result = PairsSet.find_first_opt (fun (input,value) -> print_endline ("arg:"^(string_of_int input)^" val:"^(string_of_int value)); input=0) m2;;
match result with
| None -> "nope"
| Some _ -> "yep";;
我基于文档的理解:
https://ocaml.org/api/Set.S.html
是 find_first
函数应该从最小元素(在本例中为 (0,1)
对)遍历,检查是否有任何元素满足所提供函数中的条件。
但是它不像上面描述的那样工作,因为它从最大的元素 (2,0)
开始并且只检查这一个元素。我检查了所提供元素的顺序是否对 find_first
函数的工作方式有任何影响,并且确实如此。如果我重新排列 m2
集,以便首先找到 (0,1)
元素,则会找到匹配项。
解决方法
这也让我有点困惑,但这里的关键在于“其中 f
是一个单调递增的函数”。
A monotonically increasing function 是一个不能减少的函数(尽管它的名字不一定增加)。对于返回 bool
的函数,就像我们这里的情况,这意味着它不能随着输入值的增加而从 true
变为 false
。
您的函数 fun (input,value) -> input = 0
仅用于单个值的 true
。对于任何低于 0
的值和任何大于 0
的值,它都是假的。
find_first
的实现使得只要 f
返回 true
,它就“向下”行走,只要它返回 false
,它就“向上”行走,从而找到f
返回 true
的第一个元素。
如果您改为使用函数 fun (input,value) -> input >= 0
,您会发现它会按您的预期工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。