2013-02-09 37 views
0

因此,我正在编写折叠组合函数,以使其执行过滤。合并折叠和过滤器

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] 
+0

'filter_combine'不正确,或者'filter'不是'List.filter'。 – didierc 2013-02-09 20:55:23

+1

你应该提供'fold'和'filter'的签名。 – didierc 2013-02-09 20:57:14

回答

1

我遇到一些麻烦了解这个问题。我认为你所说的是,你想编写一个函数,该函数接受一个谓词并返回一个适用于折叠的函数,以便结果将根据谓词进行过滤。

一些问题,这样的问题:

  • 有没有内置的命名fold OCaml的功能。

  • 如果你应该实现过滤,在你的实现中使用filter似乎很奇怪。

如果我假设你正在使用fold_right,那么在我看来,你想回到a -> a list -> a list类型的函数。它想要看一件事来决定做什么,而不是整件事。既然你说你没有收到编译错误,这表明你的函数名称为fold不能像我所期望的那样工作。如果您显示fold实际工作方式可能会有所帮助。