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_left或fold_right尽可能简单高效(例如,无论如何我必须扫描整个列表并且不会停在中间).
但是,在大多数情况下,我将使用"模式匹配"编写显式递归代码.
另外我在github中读了很多OCaml项目,显式递归似乎很常见.
另外,我从未听说过OCaml的融合法.
我的问题是
由于副作用,在OCaml中实现Fusion并不像在Haskell中那样容易实现.如果你继续以与GHC融合它们相同的方式融合OCaml中的函数,那么你将得到非常不可预测的结果,并且副作用的发生顺序与编写程序的顺序不同.所以,不,就像你说的那样,OCaml没有"融合法则".这并不意味着在OCaml中进行融合是不可能的,你只需要更加努力.
命令式语言的编译器有时会实现循环融合,这与Haskell中的融合具有类似的效果.OCaml可以从循环融合中受益,但它是一个更加复杂的优化实现.
Fusion是Haskell中没有副作用的好处之一.它使某些优化更容易实现,并且它们可以为优化触发器提供更强大的保证.
我认为你不需要了解融合就能成为一名有效的OCaml程序员.