Functional programming 学习函数式编程语言有多困难?

Functional programming 学习函数式编程语言有多困难?,functional-programming,Functional Programming,鉴于角色在从C到JAVA的不同命令式编程语言中拥有丰富的经验。像Haskell这样的函数式编程语言的学习曲线是什么?我还没有开发出任何实用的函数式编程语言,但适应它并没有太大困难 在开始之前,我建议递归地改进你的思维,因为这是你需要做的,无论是用熟悉的还是不熟悉的语言 此外,您还需要适应函数是对象的思想,您可以将它们传递给函数,函数可以返回它们。在使用Haskell之前,您可能会发现学习一些不完全是功能性的东西更容易,比如Lisp或ML。鉴于您的Java经验,在JVM上运行的Lisp,可能是一个

鉴于角色在从C到JAVA的不同命令式编程语言中拥有丰富的经验。像Haskell这样的函数式编程语言的学习曲线是什么?

我还没有开发出任何实用的函数式编程语言,但适应它并没有太大困难

在开始之前,我建议递归地改进你的思维,因为这是你需要做的,无论是用熟悉的还是不熟悉的语言


此外,您还需要适应函数是对象的思想,您可以将它们传递给函数,函数可以返回它们。

在使用Haskell之前,您可能会发现学习一些不完全是功能性的东西更容易,比如Lisp或ML。鉴于您的Java经验,在JVM上运行的Lisp,可能是一个很好的起点。

摘自


然而,使用过程语言或面向对象语言(如C、Java或Python)的用户应该注意:您将不得不忘记大部分已经知道的编程知识。Haskell与这些语言完全不同,需要不同的编程思维方式。进入本教程时,最好不要将Haskell与命令式语言进行比较,因为其中的许多概念(类、函数、返回)在Haskell中有着明显不同的含义。

Haskell的学习曲线略高于其他函数式语言(如OCaml),虽然这是我个人的最爱

依我看,关键是从组合、输入和输出的角度来思考(如果你来自OO,你可能几乎完全从继承的角度来思考——这可能会妨碍你的学习)

尝试将纯(无副作用)与不纯(副作用——例如IO、状态等)分开

记住,职能部门是一流公民


学习部分函数应用的技巧。一旦你习惯了它,它就非常方便。

像OP一样,我在2006年左右跳到函数式编程之前有OOP/命令式的背景

我有很多C#和Java,我想学习一门新语言。我从Python开始,在Perl上学习,在C++上剪牙齿。一切都很好,很漂亮,但没有什么新东西需要学习,我基本上是用一点不同的语法一次又一次地重新学习同一种语言。我偶然发现了Paul Graham的经典文章,他在文章中谈到了Lisp和函数式编程

我认为学习这些“晦涩”的函数式编程语言会很有趣。所以,在Erlang、Lisp、Haskell和OCaml之间,我选择OCaml并没有什么特别的原因,只是因为骆驼非常可爱(完全是!)。这里有很多新东西要处理:

  • Graaaah,为什么我必须与编译器斗争才能让类型推断正常工作
  • Arrragh,为什么这种语言没有合适的IDE?为什么emacs没有GUI编辑器?我的智能感知呢
  • 咖喱?这只是一个噱头,还是应该有用
  • 哇,我怎么能用代数数据类型做任何实际的事情呢
  • []->…|x::xs->…
    ,WTF是什么意思
对我来说,从Java到Python很容易:类似的体系结构习惯用法,类似的编程风格,等等。最困难的部分实际上是学习一个新的库,从n00b到pro需要6周的时间

从Java到OCaml真的很难,因为没有任何构建,就像从第0步开始一样。大约花了6个月的时间,我才停止对自己说“现在我该如何在OCaml中做到这一点?”


回想起来,如果我从Haskell开始,我可能不会有那么多的挣扎。可选的可变性+OOP使OCaml表面上看起来像是一个熟悉的领域,单子对我来说仍然是个谜。

这真的取决于人,不是吗?+重新打开:如果你不想看到主观问题,请将它们添加到忽略列表中。我们其他人,尤其是FP新手,可能会从这样的问题中获得一些有用的见解;如何测量学习曲线?但我不认为这是特别的“辩论”,这是“主观和辩论”密切选择的重点;它应该是为了防止火焰之战,而不是结束一些模糊的问题。我个人认为主要的问题是要接受函数式语言与“普通”命令式语言和OO语言不同,并且应该是不同的。如果你不能接受这一点,那么就很难克服“我是不幸的,为什么它看起来和行为不像XXX在抱怨”。另一种方法是不去想它或反思它,而只是去做它!我赞成这个建议。。。我一直在学习OCaml作为Haskell的垫脚石。同样在JVM上的Scala可能也是一个很好的建议——它是类型化的,并且有模式匹配。我非常不同意。一种纯粹的函数式语言将使初学者保持直截了当。LISP和ML变体会让你撒谎、欺骗和思考不纯洁的想法。如果你想快速学习FP,可以选择Haskell或Clean。@Apocalisp我对用Haskell编写的开源项目进行了调查,发现大多数使用
unsafePerformIO
之类的东西绕过类型系统,故意引入不受控制的副作用。@JonHarrop
unsafePerformIO
不是Haskell的一部分。它由GHC的外部功能接口提供。而且,“大多数使用诸如
unsafeperformIO
”之类的东西是不正确的。我认为Java很快将成为唯一没有一流函数的主流语言。几乎我能想到的所有其他主要语言都有或正在添加它们;JavaScript、C#、Perl、Ruby、Python、C(与苹果集团