无状态编程的优势?
无状态编程的优势?
我最近一直在学习函数式编程(具体来说是Haskell,但我也浏览了Lisp和Erlang的教程)。虽然我发现这些概念非常令人启发,但我仍然没有看到“无副作用”概念的实践优势。它有哪些实际优点呢?我试图以函数式的思维方式来思考,但有些情况似乎没有保存状态的简单方法,这使得它们显得过于复杂(我不认为Haskell的单子很“简单”)。
学习Haskell(或其他纯函数式语言)是否值得深入学习?函数式或无状态编程是否比过程化编程更具生产力?我以后是否可能会继续使用Haskell或其他函数式语言,还是只是为了理解而学习它?
我关心的不是性能,而是生产力。因此,我主要问的是,我在函数式语言中比在过程化/面向对象/其他语言中更具生产力吗?
你的程序越多部分是无状态的,就越有多种方法将它们组合在一起,而不会出现任何问题。无状态范例的优势不在于无状态(或纯度)本身,而在于它赋予你编写强大、可重用函数并组合它们的能力。
你可以在约翰·休斯(John Hughes)的论文《函数式编程的重要性》(PDF)中找到一个有很多例子的好教程。
如果你选择一个也拥有代数数据类型和模式匹配的函数式语言(Caml、SML、Haskell),你将更加高效。
阅读“简介函数式编程”。
无状态编程有很多优点,最重要的是可以实现高度多线程和并发代码。说得 bluntly,可变状态是多线程代码的敌人。如果值默认为不可变,程序员不必担心一个线程会改变两个线程之间共享状态的值,因此它消除了一个整个与竞争条件相关的多线程错误类。由于没有竞争条件,也没有理由使用锁,因此不可变性还消除了另一个与死锁相关的错误类。
这就是为什么函数式编程至关重要的原因,也可能是跳上函数式编程列车的最好理由。还有很多其他好处,包括简化调试(即函数是纯粹的,并且不会改变应用程序其他部分的状态),更简洁和表达力强的代码,与严重依赖设计模式的语言相比,更少的样板代码以及编译器可以更积极地优化您的代码。