如果你有一个函数“test ab”,如果a和b是直接连接的,那么它返回true,如果你有一个给定的无序列表,那么从给定列表中过滤所有连接的东西会是一个优雅而快速的解决方案吗?
示例:
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]
任何提示?
如果< - > b是直接neigbours和b - b。 c是直接邻居,然后[a; b; c]连接。
建议的“List.filter()lst”在这里没有帮助,因为它只过滤了定向的邻居。
在上面的例子中,< - > b和b - < - > c作为测试函数的直接邻居,而所有其他的不是,“filter_connected”调用将是:
“filter_connected b lst(test);;”
并将返回: [A; B; C]
希望它会更干净......
答案 0 :(得分:3)
我假设你想要从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
的{{1}}回答f
的元素列表。
获取决定每个元素是否应该进入结果列表的函数与使用此函数后过滤列表的问题正交,因此您应该首先执行此操作。
如果您希望将true
函数用作您所拥有的关系的传递闭包,则可以使用库ocamlgraph来获取该传递闭包。具体来说,在these functions中,对每个拼图使用f
,为每个拼图使用add_vertex
,然后应用函数add_edge
来获取新图transitive_closure
您可以在其中询问两个元素g
和e1
与e2
之间是否存在边缘。部分应用的函数mem_edge g e1 e2
可以传递给mem_edge g e1
。