如何查看 int 选项数组中的整数

How to see what integers are in array of int options

我正在处理一组数组,例如:

test = [|[|Some 4; Some 8; Some 3; Some 9; Some 2; Some 1; Some 6; Some 5; Some 7|]; 
         [|Some 9; Some 6; Some 7; Some 3; None; Some 5; Some 8; Some 2; Some 1|]|]

现在正在寻找如何 'gather' 所有整数,因为我想用其他 'missing' 整数替换 None 元素。所以第一个数组没有任何 None 元素,但在第二个数组中我想用 Some 4 替换 None,因为 4 是该数组中剩余的整数。为此,我必须首先找出缺少哪些整数。

我正在考虑“如果元素是 Some int 类型,那很好,但是如果元素是 None 类型,那么对于从 1 到 9 的 i 检查我是否不在数组中并将 None 更改为 Some i",但写起来有问题。 Array 库中的 find_opt 可以完成这项工作吗?

对于这个措辞糟糕的问题,我提前表示抱歉,我是 OCaml 的新手,总体上很困惑。谢谢你。 :)

考虑如何确定数组中缺少哪个数字:

let rec number_missing arr range_start range_end =
  if range_start > range_end then 
    None 
  else if Array.mem (Some range_start) arr then 
    number_missing arr (range_start + 1) range_end
  else 
    Some range_start

我们首先守卫以确保我们仍在我们正在寻找的范围内。

接下来我们检查数组是否包含范围内的第一个数字。如果是,我们知道该数字存在,我们应该再次检查,更新范围。

如果范围内的第一个数字不在数组中,那么我们可以return那个数字。

一切都包含在 option 类型中,以优雅地处理范围内没有数字丢失的事件。

你的数组为 test:

# number_missing test.(0) 1 9;;
- : int option = None
# number_missing test.(1) 1 9;;
- : int option = Some 4

现在,我们只需要遍历一个数组,并检查元素是否等于 None。如果是,我们将用 number_missing.

的结果替换它
# Array.iteri (fun i x -> if x = None then test.(0).(i) <- number_missing test.(0) 1 9) test.(0);;
- : unit = ()
# test.(0);;
- : int option array =
[|Some 4; Some 8; Some 3; Some 9; Some 2; Some 1; Some 6; Some 5; Some 7|]
# Array.iteri (fun i x -> if x = None then test.(1).(i) <- number_missing test.(1) 1 9) test.(1);;
- : unit = ()
# test.(1);;
- : int option array =
[|Some 9; Some 6; Some 7; Some 3; Some 4; Some 5; Some 8; Some 2; Some 1|]

扫描test中两个数组的第一个并没有改变任何东西,因为不需要改变,但是我们可以清楚地看到对test.(1).

的影响

如果存在多个 None 值,则此方法有效。

# let test2 = [| Some 1; Some 2; None; Some 4; None; Some 6; None; None; Some 9 |];;
val test2 : int option array =
  [|Some 1; Some 2; None; Some 4; None; Some 6; None; None; Some 9|]
# Array.iteri (fun i x -> if x = None then test2.(i) <- number_missing test2 1 9) test2;;
- : unit = ()
# test2;;
- : int option array =
[|Some 1; Some 2; Some 3; Some 4; Some 5; Some 6; Some 7; Some 8; Some 9|]

一个相当必要的解决方案,但数组适合于此。我将把这个逻辑包装在一个函数中,并建议您将 int option array array 更改为 int option list list 作为挑战并解决问题。该解决方案应该更自然地发挥作用。