【问题标题】:What languages implement features from functional programming?哪些语言实现了函数式编程的特性?
【发布时间】:2010-09-09 16:07:33
【问题描述】:

Lisp 很早就在学术界开发了一组有趣的语言特性,但其中大部分从未在生产环境中流行起来。

一些语言,如 JavaScript,采用了垃圾收集和词法闭包等基本功能,但所有可能真正改变大规模编写程序方式的东西,如强大的宏、代码即数据和自定义控件结构,似乎只在其他函数式语言中传播,这些语言都不适用于非平凡的项目。

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

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

【问题讨论】:

  • 我对你的问题投了反对票,因为你断言,“......似乎只在其他函数式语言中传播,这些语言都不适用于非平凡的项目。”您有什么证据表明 Haskell 等函数式语言不适合重要的项目?

标签: haskell functional-programming lisp enterprise ml


【解决方案1】:

Scala 是一种很酷的函数式/OO 语言,具有模式匹配、一流的函数等。优点是可以编译成Java字节码,与Java代码互操作性好。

【讨论】:

    【解决方案2】:

    你检查过F#

    【讨论】:

    • 不。似乎有点过于耦合到 Microsoft/Windows。
    • 然后试试它的跨平台父级,ocaml。
    【解决方案3】:

    许多动态编程语言实现了函数式编程的想法。较新的 .Net 语言(C# 和 VB)具有他们所谓的 lambda,但它们并非没有副作用。

    例如,将函数式编程和面向对象编程的概念结合起来并不难,但并不总是很有意义。面向对象的语言(尝试)将状态封装在对象内,而函数式语言将状态封装在函数内。如果您将对象和函数组合在一种语言中,则很难理解所有这些。

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

    【讨论】:

      【解决方案4】:

      C# 3.0 肯定可以。

      C# 现在有

      1. Lambda 表达式
      2. 高阶函数
      3. 映射/减少 + 过滤器(折叠?)到列表和所有实现 IEnumerable 的类型。
      4. LINQ
      5. 对象 + 集合初始化器。

      最后两个列表项可能不属于正确的函数式编程,反正答案是 C# 已经实现了许多来自 Lisp 等的有用概念。

      【讨论】:

      • 这似乎并不比 Javascript 好很多。 C++ 有 map/reduce/filter,我不确定 linq 是如何改进的。
      【解决方案5】:

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

      【讨论】:

      • 我是 Paul Graham 的忠实粉丝,但 Python 实际上并不像其他选项那样 lispy。 Perl 和 Ruby 在支持函数式编程方面做得更好。事实上,有一整本(免费!)关于在 Perl 中进行函数式编程的书,名为 Higher Order Perl
      【解决方案6】:

      卢阿。

      它被用作许多游戏(如魔兽世界)和应用程序(Snort、NMAP、Wireshark 等)的脚本/扩展语言。事实上,据一位 Adob​​e 开发人员称,Adobe 的 Lightroom 使用了 40% 以上的 Lua。

      Lua 背后的人多次将 Scheme 和 Lisp 列为对 Lua 的主要影响,Lua 甚至被描述为没有括号的 Scheme。

      【讨论】:

        【解决方案7】:

        有没有现代实用的 实际学习的语言 Lisp 而不是半途而废的复制 “一流的功能”,还是有 一种内在的冲突,使这 不可能?

        为什么不是 lisp、haskell、ocaml 或 f# 现代?

        您可能只需要自己承担并查看它们并意识到它们更健壮,使用 java 之类的库,然后您会想。

        从函数式语言到其他语言已经采用了很多特性。但反之亦然——例如,(某些)函数式语言有对象。

        【讨论】:

          【解决方案8】:

          Common Lisp,在现实世界中使用,虽然不是很疯狂,我猜。

          【讨论】:

            【解决方案9】:

            Scala 是采用重要学术特征的语言的绝对王者。高级种类、自类型、多态模式匹配等。所有这些都是前沿(或接近它)的学术研究主题,已作为基本特性纳入 Scala。可以说,这有损于语言的简单性,但它确实导致了一些非常有趣的模式。

            C# 比 Scala 更主流,但它也很少采用这些“外在”的功能特性。 LINQ 是 Wadler 的广义列表推导的有限实现,每个人都知道 lambda。但尽管如此,C#(理所当然地)在采用学术界的研究特征方面仍然有点保守。

            【讨论】:

            • Scala 看起来像是一种从任何地方都可以接受一切的语言。学习一定很棒,但和brainfck一样实用
            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              除了上面所说的,LISP 的许多优点都是基于保证没有副作用和使用内置数据结构。两者都很少在现实世界中成立。 ML 可能是更好的功能基础。

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                • 为此明确 +1 - Clojure 是我使用过的第一个函数式编程,它似乎真正适合并为“现实世界”而非学术用途而设计。
                【解决方案13】:

                在语言“流行”与是否具有强大、经过充分研究和设计良好的特性之间没有已知的相关性。

                关于这个主题已经说了很多。它存在于技术和艺术中的所有地方。我们知道艺术家 A 比艺术家 B 受过更多的训练,创作的作品也比艺术家 B 更广、更有深度,但艺术家 B 在市场上的成功要大得多。是因为有时代精神吗?是因为艺人B有更好的营销吗?是因为大多数人不会花时间去了解艺术家A吗?也许艺术家B暗地里很糟糕,我们应该不相信对艺术家做出判断的专家?可能以上所有,在某种程度上。

                这让学习艺术的人和学习编程语言的人疯狂。

                【讨论】:

                  【解决方案14】:

                  另一种实现函数式编程特性的“现实世界”语言是 Javascript。既然绝对一切都有价值,那么高阶函数很容易实现。您还拥有函数式编程的其他租户,例如 lambda 函数、闭包和柯里化。

                  【讨论】:

                    【解决方案15】:

                    您提到的功能(“强大的”宏、代码即数据和自定义控制结构)尚未在其他函数式语言中传播。在 Lisp 告诉我们它们是个坏主意后,它们就死了。

                    现代函数式语言(OCaml、Haskell、Erlang、Scala、F#、C# 3.0、JavaScript)不具备这些特性。

                    干杯, 乔恩·哈罗普。

                    【讨论】:

                      【解决方案16】:

                      Lisp 很早就在学术界开发了一组有趣的语言特性 世界,但它们中的大多数从未在生产环境中流行。

                      因为管理软件开发人员的人不是那种可以与比较不同语言功能进行有趣聊天的人。大约在 2000 年,我想使用 LISP 在我们的公司网站上实现 XML 到 HTML 的转换(这大约是亚马逊在 LISP 中实现后端的时候)。我没来得及。看到我工作的公司制造并出售了Common LISP environment,这有点讽刺。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-07-17
                        • 1970-01-01
                        • 2012-06-15
                        • 2011-03-30
                        • 2023-04-09
                        • 2010-09-17
                        相关资源
                        最近更新 更多