什么语言实现函数式编程的功能?

时间:2008-09-16 18:14:01

标签: haskell functional-programming lisp enterprise ml

Lisp在学术界很早就开发出了一套有趣的语言功能,但大多数都没有在生产环境中流行起来。

有些语言,比如JavaScript,改编了基本功能,如垃圾收集和词法闭包,但所有可能实际上改变你大规模编写程序的东西,如强大的宏,代码作为数据的东西和自定义控件结构,似乎只在其他功能语言中传播,其中任何一种都不适用于非平凡的项目。

函数式编程社区还提出了许多其他有趣的想法(除了函数式编程本身),如引用透明性,广义案例表达式(即模式匹配,不像C / C#开关那样残缺)和curried函数,在常规编程中看起来显然很有用,应该很容易与现有的编程实践集成,但由于某种原因似乎永远陷入学术界。

为什么这些功能很难被采用?是否有任何现代的,实用的语言实际上是从Lisp中学习而不是半复杂地复制“一流的功能”,还是存在使这不可能的内在冲突?

16 个答案:

答案 0 :(得分:20)

  

有没有现代的,实用的   实际上从中学习的语言   Lisp而不是半复制   “头等功能”,或者在那里   这种固有的冲突   不可能?

为什么不是lisp,haskell,ocaml或f#modern?

你可能只需要自己动手看看它们并意识到它们更强大,像java这样的库,你会想到。

从功能语言到其他语言已经采用了许多功能。但反之亦然 - (某些)功能语言具有对象,例如。

答案 1 :(得分:8)

Scala是一种很酷的功能/ OO语言,具有模式匹配,第一类功能等。它具有编译为Java字节码并与Java代码良好互操作的优势。

答案 2 :(得分:8)

我建议你试试Clojure。语法上很漂亮的方言,功能性(在ML意义上)和快速。您将获得不变性,软件事务内存,多版本并发控制,REPL,SLIME支持以及取之不尽的FFI。它是商业程序员的Lisp(& Haskell)。我在实际工作中每天都很愉快。

答案 3 :(得分:8)

“追赶”语言与是否具有强大,精心研究和精心设计的功能之间没有已知的相关性。

在这个问题上已经说了很多。它遍布技术和艺术。我们知道艺术家A比艺术家B有更多的训练和创作更广泛和深度的作品,但艺术家B在市场上更为成功。是因为有一个时代精神?是因为艺术家B有更好的营销方式吗?是因为大多数人不会花时间去理解艺术家A吗?也许艺术家B暗中可怕,我们应该不信任对艺术家做出判断的专家?可能以上所有,在某种程度上。

这使得研究艺术的人和学习编程语言的人疯狂。

答案 4 :(得分:7)

Common Lisp,在现实世界中使用,虽然不是很好,但我想。

答案 5 :(得分:6)

Python或Ruby。请参阅Paul Graham的thoughts on this问题“我喜欢Lisp,但我的公司不会让我使用它。我该怎么做?”。

答案 6 :(得分:5)

Scala是语言的绝对之王,它具有重要的学术特色。更高的种类,自我类型,多态模式匹配等等。所有这些都是前沿(或接近它)的学术研究课题,已被纳入Scala作为基本特征。可以说,这对langauge的简单性有害,但它确实导致了一些非常有趣的模式。

C#比Scala更主流,但它也采用了更少的“外部”功能。 LINQ是Wadler广义列表推导的有限实现,每个人都知道lambdas。但就此而言,C#(理所当然地)在采用学术界的研究特色方面仍然保守一点。

答案 7 :(得分:5)

最近,Erlang不仅通过Twitter使用,而且还通过XMPP驱动的消息传递和ejabberd等实现的兴起获得了新的曝光率。它体现了许多来自功能性编程的想法,这些想法是为此而设计的语言。最初用于运行电话交换机,由Ericson构思运行第一个GSM网络。它仍然存在,它功能齐全(作为一种语言)并在许多生产环境中使用。

答案 8 :(得分:3)

的Lua。

它被用作许多游戏(如World of Worcraft)和应用程序(Snort,NMAP,Wireshark等)的脚本/扩展语言。事实上,根据Adobe开发人员的说法,Adobe的Lightroom超过40%的Lua。

Lua背后的人一再将Scheme和Lisp列为对Lua的主要影响,Lua甚至被称为Scheme而没有括号。

答案 9 :(得分:2)

你签出了F#

吗?

答案 10 :(得分:2)

许多动态编程语言实现了函数式编程的思想。较新的.Net语言(C#和VB)具有他们所谓的lambda,但这些不是副作用。

例如,将功能编程和面向对象编程的概念结合起来并不困难,但它并不总是很有意义。面向对象语言(尝试)将状态封装在对象内,而函数语言将状态封装在函数内。如果你用一种语言组合对象和函数,那么就很难理解这一切。

已经有很多语言将这些范例组合在一起(F#)并且这可能很有用但我认为我们仍然需要几十年的时间来玩这样的语言,直到我们可以创建一个新的语言成功地将oo和函数式编程的想法结合起来的范例。

答案 11 :(得分:2)

C#3.0肯定会。

C#现在有

  1. Lambda Expressions
  2. 高阶函数
  3. 映射/缩小+过滤(折叠?)到列表以及实现IEnumerable的所有类型。
  4. LINQ
  5. Object + Collection Initializers。
  6. 最后两个列表项可能不属于正确的函数式编程,无论如何答案是C#已经实现了Lisp等许多有用的概念。

答案 12 :(得分:2)

除了上述内容之外,许多LISP的优点还在于保证缺乏副作用和使用内置数据结构。两者都很少在现实世界中存在。 ML可能是更好的功能基础。

答案 13 :(得分:2)

  

Lisp在学术界很早就开发了一套有趣的语言功能   世界,但大多数都没有在生产环境中流行起来。

因为管理软件开发人员的人并不是那种可以通过比较不同语言特征进行有趣聊天的人。大约在2000年,我想使用LISP在我们的公司网站上实现XML到HTML的转换(这是亚马逊在LISP中实现其后端的时候)。我没去。这很有讽刺意味,因为我正在为制作并出售Common LISP environment的公司制作并出售。{/ p>

答案 14 :(得分:1)

实现函数式编程功能的另一种“真实世界”语言是Javascript。由于绝对一切都有价值,因此很容易实现高阶函数。您还有其他函数式编程租户,例如lambda函数,闭包和currying。

答案 15 :(得分:0)

您引用的功能(“强大的”宏,代码作为数据的东西和自定义控件结构)没有在其他函数语言中传播。在Lisp告诉我们这是一个坏主意之后,他们死了。

现代函数式语言(OCaml,Haskell,Erlang,Scala,F#,C#3.0,JavaScript)没有这些功能。

干杯, Jon Harrop。