Ocaml 折叠与过滤相结合

Ocaml 折叠与过滤相结合,ocaml,Ocaml,所以我正在为fold编写一个组合函数,它将执行过滤 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

所以我正在为fold编写一个组合函数,它将执行过滤

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]

我理解这个问题有点困难。我想你要说的是,你想写一个函数,它接受一个谓词,并返回一个适合与fold一起使用的函数,这样结果就会根据谓词过滤

问题的一些问题:

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

  • 如果要实现过滤,那么在实现中使用
    filter
    似乎相当奇怪


如果我假设您使用的是
fold\u right
,那么在我看来,您可能希望返回类型为
a->a list->a list
的函数。它想看一件事来决定做什么,而不是看一大堆事情。既然您说没有得到编译错误,这表明名为
fold
的函数不能像我预期的那样工作。如果你展示一下折叠的实际工作原理,可能会有所帮助。

我在理解这个问题时遇到了一些困难。我想你要说的是,你想写一个函数,它接受一个谓词,并返回一个适合与fold一起使用的函数,这样结果就会根据谓词过滤

问题的一些问题:

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

  • 如果要实现过滤,那么在实现中使用
    filter
    似乎相当奇怪


如果我假设您使用的是
fold\u right
,那么在我看来,您可能希望返回类型为
a->a list->a list
的函数。它想看一件事来决定做什么,而不是看一大堆事情。既然您说没有得到编译错误,这表明名为
fold
的函数不能像我预期的那样工作。如果您演示了折叠的实际工作方式,可能会有所帮助。

过滤器
类型错误,或者
过滤器
不是列表。过滤器。您应该提供折叠的签名,并且
过滤器
过滤器类型错误,或者
filter
不是
列表。filter
。您应该提供
fold
filter
的签名。
[-2; 2] = fold (filter_combine (fun (x: int) -> (abs x) > 1)) [] [-2; -1; 0; 1; 2]