1

所以我正在为 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]

这是一个有效的...

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

1 回答 1

1

我在理解这个问题时遇到了一些麻烦。我认为您的意思是您要编写一个函数,该函数接受一个谓词并返回一个适合与折叠一起使用的函数,以便结果将根据谓词进行过滤。

问题的一些问题:

  • 没有名为fold.

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

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

于 2013-02-09T20:46:25.423 回答