这个问题出自问题/software/25569/is-haskell-worth-learning
通常,对于Haskell如何提高您在其他语言中的编码技能,通常会重复声明一些,此外,这是因为Haskell是无状态的,这是一件好事。
为什么?
我见过有人将其与只用左手打字,或者闭上眼睛一天,仅依靠触摸来进行比较。当然,还有更多呢?
它与硬件内存访问有关,还是与其他性能提升有关?
这个问题出自问题/software/25569/is-haskell-worth-learning
通常,对于Haskell如何提高您在其他语言中的编码技能,通常会重复声明一些,此外,这是因为Haskell是无状态的,这是一件好事。
为什么?
我见过有人将其与只用左手打字,或者闭上眼睛一天,仅依靠触摸来进行比较。当然,还有更多呢?
它与硬件内存访问有关,还是与其他性能提升有关?
Answers:
我的头上至少有三大优势:
它使程序更接近数学表达式。在数学中,x
它不变,直到解决方程式,您才知道它是什么。
最后,还有是状态改变(毕竟,这是计算机如何工作在较低水平); 但仅限于特定语言。因为编译器知道它不会改变其他代码所依赖的任何内容,所以它为编译器提供了移动代码进行优化的巨大机会。
并发代码无需同步即可访问不变的数据,因此,无论是在SMP共享内存系统(当今的所有多核系统)还是在松散捆绑的集群中,并发性都得到了增强。
这是另一个优点:减少耦合。如果您有如下代码:
function doStuff(x) { return x + y;}
在其他地方,您可以:
function doOtherStuff(x) { y++; return y + x;}
则这两个函数是隐式相关的。没有简单的方法可以告诉您呼叫doStuff
受到呼叫的影响doOtherStuff
。如果没有可变状态,则必须使连接明确。
当然,这不是所有可变状态都存在的问题,而是普遍性可变状态都存在的问题。真正的解决方案是在默认情况下具有不变性,并通过某种方式“标记”并将可变状态限制在您需要的位置。
简化的答案是:当您以纯功能语言看到名称时,只需简单地查找其定义即可知道相关的值。如果您具有可变变量,则只能通过最后执行几个分配中的哪个来区分,因此您还必须分析控制流,而控制流又可能是有条件的,从而给您带来多种可能性。要获得指数级爆炸,您只需考虑分配的RHS本身取决于变量,因此您也必须递归分析它们。
上面分析的底线是,没有注释来解释意图,不变量和语义是站不住脚的:这些可能难以解释,并且可能很难验证语义是否在实际代码中得到遵守。
这个答案基本上是@Javier点1的扩展。
我认为这也是对欺诈性OO机制的流行的一种解释:使用OO封装了可变状态,通过在某种程度上定位突变并允许更健壮的语义表达和验证,可以使分析变得更加容易。
已经指出,函数式编程不是答案。正确的答案是同时支持归纳(功能性)和协和(程序性)编程的系统,因此正确的工具可以处理无状态和有状态编程。仅仅是建设性的(功能性)理论已经建立,而状态管理理论仍处于起步阶段。