What languages implement features from functional programming?Lisp在学术界很早就开发了一套有趣的语言功能,但是其中大多数从未在生产环境中流行。 某些语言(例如JavaScript)适应了垃圾回收和词法关闭等基本功能,但实际上可能会改变您大规模编写程序的所有方式(例如强大的宏,代码数据事物和自定义控件结构)似乎是在其他功能语言中传播的,而对于非平凡的项目而言,没有任何一种实用。 函数式编程社区还提出了许多其他有趣的想法(除了函数式编程本身),例如引用透明性,通用的大小写表达式(即模式匹配,不像C / C#开关那样残缺)和咖喱函数,在常规程序设计中似乎显然有用,并且应该易于与现有程序设计实践相集成,但是由于某种原因,它似乎永远留在学术界。 为什么这些功能很难采用?是否有实际上可以从Lisp中学习的现代实用语言,而不是半信半疑地复制"一流的功能",还是有固有的冲突使之不可能?
为什么Lisp,Haskell,ocaml或F#不是现代的? 您可能只需要自己动手看一下它们,然后意识到它们更健壮(例如使用Java之类的库),便会想到。 从功能语言到其他语言,已经采用了许多功能。但是反之亦然-例如,(某些)功能语言具有对象。 Scala是一种很酷的功能/ OO语言,具有模式匹配,一流的功能等。它具有可编译为Java字节码并与Java代码良好互操作的优点。 语言"流行"与该语言是否具有强大的,经过充分研究的,精心设计的功能之间没有已知的关联。 关于这个问题已经说了很多。它在技术以及艺术中无处不在。我们知道,与艺术家B相比,艺术家A受过更多的训练,并且创作的作品更具广度和深度,但艺术家B在市场上的成功要大得多。是因为有一个时代精神吗?是因为艺术家B有更好的营销?是否因为大多数人不花时间去了解艺术家A?也许艺术家B暗中可怕,我们应该不信任对艺术家做出判断的专家吗?以上可能在某种程度上还是以上所有。 这驱使学习艺术的人们和学习编程语言的人们疯狂。 我建议您尝试Clojure。语法优美的方言,功能性(从ML角度而言)且快速。您将获得不变性,软件事务存储,多版本并发控制,REPL,SLIME支持和不竭的FFI。这是业务程序员的Lisp(&Haskell)。我在每天的真实工作中度过了愉快的时光。 我猜想,在现实世界中使用的Common Lisp并不是那么疯狂。 Python或Ruby。在问题"我喜欢Lisp但我的公司不允许我使用它。我应该怎么办?"的问题中,请参阅Paul Graham的想法。 最近,Erlang不仅通过被Twitter使用,而且通过XMPP驱动的消息传递和ejabberd等实现方式的兴起而获得了新的曝光。它具有许多功能编程思想,这些思想来自于功能编程。最初用于运行电话交换机,并由Ericson设想用于运行第一个GSM网络。它仍然存在,它具有完整的功能(作为一种语言),并在许多生产环境中使用。 Scala是采用重要学术特征的语言的绝对之王。更高种类,自我类型,多态模式匹配等。所有这些都是尖端的(或接近它)学术研究主题,已作为基本功能并入Scala。可以说,这损害了语言的简单性,但确实导致了一些非常有趣的模式。 C#比Scala更主流,但是C#所采用的"外部"功能较少。 LINQ对于Wadler的广义列表理解是有限的实现,并且每个人都知道lambda。但是尽管如此,C#(理所当然)在采用学术界的研究功能时仍然有些保守。 Lua中。 它被用作许多游戏(如《魔兽世界》)和应用程序(Snort,NMAP,Wireshark等)的脚本/扩展语言。实际上,根据Adobe开发人员的说法,Adobe的Lightroom占Lua的40%以上。 Lua背后的家伙曾多次将Scheme和Lisp列为对Lua的主要影响力,而Lua甚至被描述为不带括号的Scheme。 除了所说的以外,LISP的许多优点还基于保证没有副作用并使用内置数据结构。两者在现实世界中很少见。 ML可能是更好的功能基础。
因为管理软件开发人员的人不是那种可以比较不同语言功能的有趣的人。在2000年左右,我想使用LISP在我们的公司网站上实现XML到HTML的转换(这是在Amazon在LISP中实现其后端的时候)。我没去当我为之工作的公司制造并出售Common LISP环境时,这有点讽刺。 C#3.0绝对可以。 C#现在有 最后两个列表项可能未经过适当的功能编程,无论如何,答案是C#从Lisp等实现了许多有用的概念。 许多动态编程语言都实现了功能编程的思想。较新的.Net语言(C#和VB)具有所谓的lambda语言,但它们并非没有副作用。 例如,将功能性编程和面向对象的编程中的概念组合起来并不难,但并不总是很有意义。面向对象的语言(试图)将状态封装在对象内部,而功能语言则将状态封装在函数内部。如果用一种语言组合对象和函数,则很难理解所有这些。 有很多语言通过将它们放在一起来组合这些范式(F#),这很有用,但是我认为我们仍然需要几十年的时间来使用像这样的语言,直到我们能够成功创建一个新范式将结合oo和函数式编程的思想。 您是否已签出F# 实现功能编程功能的另一种"现实世界"语言是Javascript。由于绝对一切都具有价值,因此可以轻松实现高阶函数。您还具有其他函数式编程租户,例如lambda函数,闭包和curring。 您所引用的功能("强大的"宏,作为数据编码的事物和自定义控件结构)尚未在其他功能语言中传播。他们在Lisp教我们一个坏主意之后就死了。 现代功能语言(OCaml,Haskell,Erlang,Scala,F#,C#3.0,JavaScript)没有这些功能。
干杯, |