在OCaml中“打破”折叠?

时间:2011-09-15 13:37:48

标签: functional-programming ocaml break fold

我有一个使用List.fold_left2来检查列表是否是回文的函数。 (使用折叠不是可选的:这是一个家庭作业问题。)

let is_p lst =
  List.fold_left2 (fun acc e1 e2-> if (e1=e2) then acc else false) true lst (List.rev lst)

但我想优化它。一旦发现一个不匹配,最好的方法是什么才能返回“假”?

我宁愿不抛出异常,但我意识到这可能是最好的答案。我还考虑过将匿名函数更改为:

fun acc e1 e2-> if (not acc) then false else (if (e1=e2) then acc else false)

1 个答案:

答案 0 :(得分:4)

使用异常,或将折叠“展开”到自定义递归函数中。折叠模式总是遍历完整列表。

一定要对两者进行基准测试,因为异常处理在某些语言中可能是一项昂贵的操作(我不确定OCaml是否也是如此)。