Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
find_first函数如何在OCaml集合中工作?_Ocaml - Fatal编程技术网

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
。无论如何,这肯定回答了我的问题。再次感谢您的全面解释。