如何在OCaml的列表列表中找到数字的反义词?

时间:2019-10-21 20:47:56

标签: list ocaml

我正在尝试在列表列表中查找数字的反义词。我想遍历列表列表的每个元素,并检查列表列表中是否与此元素相反。

这是我到目前为止所做的:

let rec findOpposite l  =
match l with
| [] -> false
| f::x::ll -> if (List.mem (-x) f = false && List.mem (-x) ll = false) then true else findOpposite ll;;

我天真的认为'f'代表列表中的所有先前元素...

我还探讨了此解决方案:整理列表,使其更加简单。但是现在我有点迷路了。

这里期望的是遍历列表的每个元素,检查列表中是否有相反的元素,如果是-> true,否则继续直到结束。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果这不是一项任务,我可以给出一个可能的解决方案。如果我理解正确,您想知道是否在求反时关闭了一组整数。您可以计算出集合,然后取反集合,然后查看两个集合是否相等。

module ISet =
    Set.Make(struct type t = int let compare = compare end)

let get_set ll =
    List.fold_left
       (List.fold_left (fun is i -> ISet.add i is))
       ISet.empty
       ll

let negate_set is = ISet.map (fun i -> -i) is

let closed_set is = ISet.equal is (negate_set is)

您可以这样尝试:

# closed_set (get_set [[1;2]; [-2;-2]; [3;-3;-1]]);;
- : bool = true
# closed_set (get_set [[1;2]; [-2;-2]; [3;-3]]);;
- : bool = false