【问题标题】:Filtering directly and indirectly connected things from list从列表中过滤直接和间接连接的事物
【发布时间】:2011-12-10 21:41:23
【问题描述】:

如果你有一个函数“test a b”,如果 a 和 b 直接连接,并且如果你有一个给定的无序列表,那么从给定列表中过滤所有连接的东西的优雅和快速的解决方案是什么?

例子:

let test a b = let diff = a - b in diff == 0 ;;

let lst = [4;1;7;3;8;9;2;0] ;;

filter_connected 2 lst ;;

-> [4;1;3;2;0]

有什么提示吗?


嗯,我会尝试完善我的问题...

  1. 存在一个未排序的事物列表,pE。 “让 lst = [a;b;c;d;e;f;g;h];;”带类型 val a' 列表
  2. 还有一个函数可以决定两个事物是否可以直接连接,或者换句话说,如果两个事物是直接邻居: val 测试:a' -> a' -> bool
  3. 我需要的是一个具有三个参数的函数,第一个是特定的东西,第二个是上面建议的未排序的东西列表,最后一个是上面描述的测试函数: val filter_connected : a' -> a' list -> (a' -> a' -> bool) -> a' list

如果 a b 是直接邻居且 b c 是直接邻居,则 [a;b;c] 是连接的。

建议的“List.filter () lst”在这里没有帮助,因为它只过滤定向邻居。

在上面的示例中,a b 和 b c 作为测试函数的直接邻居,而所有其他函数都不是,“filter_connected”调用将是:

"filter_connected b lst (test);"

并且会返回: [a;b;c]

希望它会更干净......

【问题讨论】:

  • 我很确定你的意思是diff = 0,你写了diff == 0,只是因为它们在当前的实现中做同样的事情。但话又说回来,如果test 是你所说的“连接”的一个例子,你为什么不把它传递给filter_connected 更重要的是,连接性的定义不只是平等吗?它应该是怎样的?用来获取[4;1;3;2;0]?
  • 粘贴您的代码,并将其格式化以获得更好的答案(如果有比 Pascal 更好的答案)

标签: list filter components ocaml


【解决方案1】:

我将假设您想要获取原始列表中距离 2 小于 2 的元素。

        Objective Caml version 3.11.1

# let test x = abs (x - 2) <= 2 ;;
val test : int -> bool = <fun>
# List.filter test [4;1;7;3;8;9;2;0] ;;
- : int list = [4; 1; 3; 2; 0]
# 

List.filter 是标准库中的一个函数。 List.filter f l 生成 l 的元素列表,f 回答 true

获得决定每个元素是否应该进入结果列表的函数与一旦拥有此函数后过滤列表的问题是正交的,因此您应该首先这样做。

如果您希望为f 使用作为您拥有的关系的传递闭包的函数,您可以使用库ocamlgraph 来获得该传递闭包。具体来说,在these functions 中,对每个拼图块使用add_vertex,对每个关系使用add_edge,然后应用函数transitive_closure 得到一个新图形g,您可以在其中询问是否存在两个元素 e1e2mem_edge g e1 e2 之间的边。部分应用函数mem_edge g e1可以传递给List.filter

【讨论】:

  • +1:提到 ocamlgraph,喜欢这个库,不过我花了一段时间才理解。 :-)
猜你喜欢
  • 2022-01-16
  • 2010-10-13
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2018-04-09
  • 1970-01-01
相关资源
最近更新 更多