我在 lisp 语言家族中接受过一些培训,现在我正在学习一些 Haskell,以实现我自己的利益。在 lisp 中,函数式风格是可以的,但在少数情况下,命令式风格对于获得良好的性能是必要的,例如
附加
Append 很慢,因为它必须复制它的第一个参数(有时 x100 与成功摆脱它的版本一样慢)。一种补救方法是将第一个列表的最后一个指针移动到第二个列表的开头,而不是追加。当然,这是一种破坏性的操作。
种类
快速排序的功能版本创建了许多中间列表,这在某种程度上违背了算法的目的,即尽可能快。AFAIR,在 common lisp 中,sort 是唯一没有函数版本的破坏性函数。
长度
这在 lisp 中是一项代价高昂的操作,因为必须遍历整个列表才能获得其长度。不必如此,afaik clojure 以对数时间计算列表的长度。解决方案通常是在命令式循环中动态计算长度。
我的问题是,我们如何在 haskell 中处理这些问题?