结合折叠和过滤器

时间:2013-02-09 20:17:44

标签: ocaml

所以我正在为折叠编写一个组合函数,以便进行过滤。

let filter_combine (pred: 'a -> bool) : a' list -> 'a list -> 'a list =
fun (x: 'a) (y: 'a list) -> x :: (filter pred y)

我没有任何编译问题,但我的两个测试用例中有一个失败了。我的实施有什么问题?

这是失败的测试案例......

[-1; 1] = fold (filter_combine (fun (x: int) -> (abs x) mod 2 <> 0)) [] [-2; -1; 0; 1; 2]

这是有效的......

[-2; 2] = fold (filter_combine (fun (x: int) -> (abs x) > 1)) [] [-2; -1; 0; 1; 2]

1 个答案:

答案 0 :(得分:1)

我在理解这个问题时遇到了一些麻烦。我想你所说的是你想编写一个带谓词的函数,并返回一个适合与fold一起使用的函数,以便结果根据谓词进行过滤。

问题的一些问题:

  • 没有名为fold的内置OCaml函数。

  • 如果您应该实施过滤,在您的实施中使用filter似乎相当奇怪。

如果我假设你正在使用fold_right,那么在我看来你想要返回a -> a list -> a list类型的函数。它想要看一件事来决定做什么,而不是一整套事情。由于您说您没有收到编译错误,这表明您的fold函数不能正常工作。如果你展示fold实际上是如何工作的,那可能会有所帮助。