我正在尝试使用函数式语言,并发现有些算法(尤其是那些使用动态规划的算法)在编写时更难且有时最坏情况下的运行时间更低效。在使用不可变变量和无副作用的函数式语言中,是否存在一类较低效的算法?
同时,是否有参考资料可以帮助我编写更难的算法(也许是通过共享状态进行优化的算法)?
谢谢
我正在尝试使用函数式语言,并发现有些算法(尤其是那些使用动态规划的算法)在编写时更难且有时最坏情况下的运行时间更低效。在使用不可变变量和无副作用的函数式语言中,是否存在一类较低效的算法?
同时,是否有参考资料可以帮助我编写更难的算法(也许是通过共享状态进行优化的算法)?
谢谢
虽然我想说任何算法都可以轻松地从命令式的转换为函数式的,但事实并非如此。然而,我相信问题不在于算法本身,而是它们操作的数据结构,这些数据结构基于命令式状态的概念。您可以在此文章中找到很长的函数数据结构列表。
与此相反,如果您开始使用更纯粹的函数式样式,则程序中的许多复杂性将降低,并且许多对重度命令式数据结构的需求将消失(例如,命令式语言中非常常见的指针用于实现恶劣的设计模式,这通常会转化为函数级别的多态和类型类的巧妙使用)。
编辑:我认为这个问题的本质涉及如何用函数式方式表达计算。然而,应该注意的是,有方法以函数式的方式定义有状态的计算。或者说,可以使用函数式技术来推理有状态的计算。例如,Ynot 项目使用参数化的单子,在其中通过单子绑定跟踪堆(以分离逻辑的形式表示)的事实。
顺便说一下,即使在ML中,我也不认为动态规划有那么难。动态规划问题通常通过参数来累积某个序列的构造值以计算最终答案,在某些情况下可能需要一个延续。使用尾递归,这与命令式语言一样美观高效。现在当然,您可能会遇到这样的论点:如果这些值是列表(例如),那么我们可以将它们作为数组在命令式上实现,但对于此,请参阅文章内容 :-)
在低渐进代价下可以实现命令式特征,因此从抽象意义上说,将命令式代码翻译为纯函数式的宇宙并不存在本质困难。当然,在实践中是存在的。 :-) 参考Pippenger的“Pure versus Impure Lisp”以及引用它的论文。