无状态编程的优点?

我最近一直在学习函数式编程(特别是Haskell,但我也经历了关于Lisp和Erlang的教程)。 虽然我发现这些概念非常有启发性,但我仍然没有看到“无副作用”概念的实际意义。 它的实际优势是什么? 我试图用功能思维来思考,但是有些情况看起来过于复杂,没有以简单的方式保存状态的能力(我不认为Haskell的monads很容易)。

是否值得继续深入学习Haskell(或另一种纯粹功能的语言)? 功能性或无状态编程实际上比程序更高效? 以后我是否会继续使用Haskell或其他函数式语言,或者我应该只是为了理解而学习它?

我关心的不是性能而是生产力。 所以我主要问的是,在功能性语言中,我是否会比程序/面向对象/其他方面更有成效。


简单阅读函数式编程。

无状态编程有很多优点,其中最重要的是多线程和并发代码。 说穿了,可变状态是多线程代码的敌人。 如果默认值是不可变的,程序员不需要担心一个线程会改变两个线程之间共享状态的值,所以它消除了与竞争条件有关的整个类的多线程错误。 由于没有竞争条件,所以也没有理由使用锁,所以不变性消除了与死锁有关的另一类整体错误。

这就是为什么函数式编程很重要的一个重要原因,并且可能是在功能性编程序列上跳跃的最好的原因。 还有很多其他好处,包括简化的调试(即,功能是纯粹的,不会在应用程序的其他部分中改变状态),与代码严重依赖于设计模式的语言相比,更简洁和表达的代码,更少的样板代码,以及编译器可以更积极地优化你的代码。


您的程序中有越多的程序是无状态的, 将更多的程序放在一起而没有任何中断 。 无国籍范式的力量本身不在于无国籍(或纯洁),而在于它赋予你编写强大的,可重用的功能并将它们结合起来的能力。

您可以在John Hughes的论文Why Functional Programming Matters(PDF)中找到很多很好的教程。

你会变得更有效率,特别是如果你选择一个功能语言,也有代数数据类型和模式匹配(Caml,SML,Haskell)。


其他许多答案都集中在函数式编程的性能(并行)方面,我认为这非常重要。 但是,您确实具体询问生产力问题,因为您可以在功能范例中比在命令范例中更快地编写相同的东西。

我实际上从个人经验中发现,用F#编程匹配我认为更好的方式,因此更容易。 我认为这是最大的区别。 我已经用F#和C#编写了程序,而F#中的“与语言对抗”的方式很少,我喜欢它。 您不必考虑F#中的细节。 以下是我发现我非常喜欢的一些例子。

例如,尽管F#是静态类型的(所有类型都是在编译时解析的),但类型推断会判断出你有什么类型,所以你不必说出来。 如果它无法解决它,它会自动使你的功能/类/任何通用。 所以你永远不必写任何通用的东西,它都是自动的。 我发现这意味着我花更多时间思考这个问题,而不是如何实现它。 事实上,每当我回到C#时,我发现我真的很想念这种类型的推理,你从来没有意识到如何分散它,直到你不再需要它。

同样在F#中,不是编写循环,而是调用函数。 这是一个微妙的变化,但意义重大,因为您不必再​​考虑循环结构。 例如,下面是一段代码,它可以通过并匹配一些东西(我不记得是什么,它来自项目欧拉拼图):

let matchingFactors =
    factors
    |> Seq.filter (fun x -> largestPalindrome % x = 0)
    |> Seq.map (fun x -> (x, largestPalindrome / x))

我意识到,在C#中做一个过滤器,然后映射(这是每个元素的转换)将是非常简单的,但你必须考虑在较低的水平。 特别是,你必须自己编写循环,并有你自己的明确的if语句,以及这些类型的东西。 自从学习F#之后,我意识到我已经发现以功能方式编写代码更容易,如果你想要过滤,编写“过滤器”,如果你想映射,你写“map”,而不是实现每个细节。

我也喜欢|>运算符,我认为它将F#与ocaml以及其他函数式语言分开。 它是管道运算符,它可以让你将一个表达式的输出“输送”到另一个表达式的输入中。 它使代码遵循我的想法。 就像在上面的代码片段中那样,这就是说,“采取因素序列,过滤它,然后映射它。” 这是一个非常高的思维水平,你没有得到一个命令式编程语言,因为你很忙,编写循环和if语句。 每当我使用另一种语言时,这是我最想念的一件事。

所以就在一般情况下,尽管我可以在C#和F#中编程,但是我发现使用F#更容易,因为您可以在更高级别上进行思考。 我认为,因为从函数式编程中删除了更小的细节(至少在F#中),所以我的工作效率更高。

编辑 :我在其中一个评论中看到,你要求在功能性编程语言中使用“状态”的例子。 F#可以写成命令性的,所以下面是一个直接的例子,说明如何在F#中使用可变状态:

let mutable x = 5
for i in 1..10 do
    x <- x + i
链接地址: http://www.djcxy.com/p/14185.html

上一篇: Advantages of stateless programming?

下一篇: How to best to represent a programming language's grammar?