find_first函数如何在OCaml集合中工作?
我很难理解为什么以下代码找不到任何匹配结果:find_first函数如何在OCaml集合中工作?,ocaml,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.(e
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";;
我基于文件的理解:
find_first
函数应该从最小的元素(在这种情况下是(0,1)
对)开始遍历,检查所提供函数中是否有元素符合条件
但是,由于它从最大的元素
(2,0)
开始,并且只检查这一个元素,因此它不按上述方式工作。我已经检查了所提供元素的顺序是否对find_first
函数的工作方式有任何影响。如果我重新排列m2
集合,使(0,1)
元素首先找到匹配项。这也让我有点困惑,但这里的关键是“其中f
是一个单调递增的函数”
A是一个函数,它不能减少(尽管它的名称,但它不一定增加)。对于返回bool
的函数,就像我们在这里看到的,这意味着它不能随着输入值的增加从true
变为false
您的函数fun(输入,值)->input=0
仅适用于单个值。对于低于0
的任何值和大于0
的任何值,该值均为false
find_first
的实现方式是,只要f
返回true
,它就“向下”,只要返回false
,它就“向上”,从而找到f
返回true
的第一个元素
如果您使用函数
fun(input,value)->input>=0
,希望您会发现它会像您期望的那样工作。这也让我有点困惑,但这里的关键是“其中f
是一个单调递增的函数”
A是一个函数,它不能减少(尽管它的名称,但它不一定增加)。对于返回bool
的函数,就像我们在这里看到的,这意味着它不能随着输入值的增加从true
变为false
您的函数fun(输入,值)->input=0
仅适用于单个值。对于低于0
的任何值和大于0
的任何值,该值均为false
find_first
的实现方式是,只要f
返回true
,它就“向下”,只要返回false
,它就“向上”,从而找到f
返回true
的第一个元素
如果您使用函数
fun(input,value)->input>=0
,您将有望发现它会像您预期的那样工作。@glennsi感谢您的回复!当我实际需要找到第一个值(这里称为input)等于0的对时,情况如何?无法使用此函数吗?input>=0
应该可以这样做。不是吗?如果不存在输入为0的元素,我猜您希望它失败/返回None
。这样就不会直接起作用,但您可以在事后轻松地检查它。由于它查找最低的元素,如果该元素没有input=0
,则知道ti在集合中不存在。input>=0
确实找到了一个结果。但正如您所说,如果没有元素与代码片段中提供的谓词匹配,我希望它返回None
。无论如何,这肯定回答了我的问题。再次感谢您的全面解释。@glennsi感谢您的回复!当我实际需要找到第一个值(这里称为input)等于0的对时,情况如何?无法使用此函数吗?input>=0
应该可以这样做。不是吗?如果不存在输入为0的元素,我猜您希望它失败/返回None
。这样就不会直接起作用,但您可以在事后轻松地检查它。由于它查找最低的元素,如果该元素没有input=0
,则知道ti在集合中不存在。input>=0
确实找到了一个结果。但正如您所说,如果没有元素与代码片段中提供的谓词匹配,我希望它返回None
。无论如何,这肯定回答了我的问题。再次感谢您的全面解释。