从列表中直接和间接过滤事物

时间:2010-03-15 08:53:22

标签: list filter components ocaml

如果你有一个函数“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]

任何提示?


嗯,我会尽力改进我的问题......

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

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

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

    “filter_connected b lst(test);;”

    并将返回: [A; B; C]

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

1 个答案:

答案 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您可以在其中询问两个元素ge1e2之间是否存在边缘。部分应用的函数mem_edge g e1 e2可以传递给mem_edge g e1