OCaml是否有融合法

Jac*_*ale 4 ocaml haskell functional-programming

最近我正在阅读一些涉及Haskell的函数式编程书籍.

看来Haskell非常喜欢"模块化程序",例如,

f :: (Integer,Integer) -> Integer
f = sum . map sq . filter . odd . between
Run Code Online (Sandbox Code Playgroud)

即使可以写出相同的功能

f' (m, n) = go m
  where go m | m > n = 0
             | otherwise = go (m + 1) + if odd m then sq m else 0
Run Code Online (Sandbox Code Playgroud)

"融合法"也很受欢迎并被使用(http://www.cs.ox.ac.uk/ralf.hinze/publications/IFL10.pdf)


我不是OCaml专家,但我会使用fold_leftfold_right尽可能简单高效(例如,无论如何我必须扫描整个列表并且不会停在中间).

但是,在大多数情况下,我将使用"模式匹配"编写显式递归代码.

另外我在github中读了很多OCaml项目,显式递归似乎很常见.

另外,我从未听说过OCaml的融合法.


我的问题是

  1. OCaml是否与上面Haskell中所示的模块化程序相同?
  2. OCaml也有融合法吗?
  3. 如果我想成为OCaml专业人士,我是否应该真正关心或学习Haskell的融合法?

sve*_*son 7

由于副作用,在OCaml中实现Fusion并不像在Haskell中那样容易实现.如果你继续以与GHC融合它们相同的方式融合OCaml中的函数,那么你将得到非常不可预测的结果,并且副作用的发生顺序与编写程序的顺序不同.所以,不,就像你说的那样,OCaml没有"融合法则".这并不意味着在OCaml中进行融合是不可能的,你只需要更加努力.

命令式语言的编译器有时会实现循环融合,这与Haskell中的融合具有类似的效果.OCaml可以从循环融合中受益,但它是一个更加复杂的优化实现.

Fusion是Haskell中没有副作用的好处之一.它使某些优化更容易实现,并且它们可以为优化触发器提供更强大的保证.

我认为你不需要了解融合就能成为一名有效的OCaml程序员.