performance - 折叠优化

标签 performance functional-programming ocaml fold

我只是好奇是否有任何(仅限一阶多态)折叠优化。

对于 map ,有森林砍伐:map g (map f ls) => map (g . f) ls , 和 rev (map f ls) => rev_map f ls (在 Ocaml 中更快)。

但是 fold 是如此强大,它似乎无视任何优化。

最佳答案

显而易见的:

fold_left f acc (List.map g li) => fold_left (fun acc x -> f acc (g x)) acc li
fold_right f li acc => fold_left f acc li (* if (f,acc) is a monoid *)

您可能对有关该主题的经典论文“使用香蕉、镜头、信封和带刺铁丝网进行函数式编程”感兴趣。但是请注意,它是技术性的并且具有难以理解的符号。

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.125

编辑:我的第一条规则的第一个版本是错误的,感谢 vincent-hugot 进行了编辑。

关于performance - 折叠优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4851542/

相关文章:

haskell - 在 Haskell 中实现函数加法

function - 是否有一个函数的名称,该函数接受一段数据和一个函数列表,并将每个函数应用于最后一个函数的结果?

arrays - Ruby 中的并行分配性能

javascript - 使用Javascript创建元素或纯文本时浏览器性能是否有差异

scala 文本中单词之间的绝对最小距离

debugging - Emacs中如何实现错误回溯?

arrays - 在 OCaml 中设置二维数组的函数

MYSQL 查询优化 : build seperate tables with ORDER BY done so don't need indexes for SELECT ORDER BY

performance - select * into newtable 和 create table newtable AS 的区别

javascript - 从 Node JS 中的数组获取条目