36

有哪些语言可以同时促进面向对象和函数式编程?我知道任何支持一流函数的语言都可以被认为是函数式的,但我正在寻找一种专门针对两种编码风格的语法。

使用这样的语言,我想象将所有状态更改隔离到单个代码部分,并让程序的其余部分纯粹是功能性的。光是想想就让我流口水(调试天堂!)。

到目前为止,我已经发现了Scala,尽管我只是听说过它(而且它看起来很棒)。在这种“混合风格”范式中是否有任何大的竞争者?

4

13 回答 13

22

Javascript:面向对象函数式.

于 2009-06-18T22:59:08.820 回答
21

最著名的是OCamlF#(可以模糊地描述为 .NET 的 OCaml)。

还有许多其他多范式语言,例如Oz,但它们主要具有教学价值。相比之下,OCaml 非常实用。它几乎和 C 一样快,几乎和 Haskell 一样漂亮 :)

Python 和 Ruby 等流行的脚本语言也可以让您以函数式风格进行编程。但是,它们没有提供“经典”函数式语言(以及 OCaml)所具有的最强大的工具之一:模式匹配(不要将其误认为是正则表达式)。

于 2009-06-18T22:57:45.547 回答
12

此外,许多脚本语言(如 Python、Ruby、Lua 等)具有此功能,但缺少函数式语言的许多优秀特性,例如代数数据类型和模式匹配。

于 2009-06-18T22:57:02.520 回答
10

Haskell: Pure functional ,pretty much no OO, but go ahead, take the dive. :D

Scala: Beautiful mix of OO and FP, could possibly overtake java as premier language on the JVM in a decade or 2. I like it because it brings functional programming to the java platform, something that's sorely need IMHO.

C#: Awesome support for OO, as well as getting more functional (first class functions already, we'll see what improvements .net 4 brings)

F#: .net language Built to be functional specifically, as opposed to C#, which was originally conceived for OO stuff.

Python: Great for OO, but not at all suited to FP

Javascript: Supports first-class functions, but not specifically designed for FP like Scala and F#. Still slightly better than python IMHO.

Why do you want to mix OO and FP? As a stepping stone?

于 2010-01-28T23:23:49.033 回答
9

据我所知,OCaml 和 F# 是最流行的混合 OOP 和 FP 的语言。

大多数语言,比如 Ruby,都混合了函数式编程,但很多人甚至没有意识到这一点。我发现像这样的语言在语法方面还有很多不足之处。

于 2009-06-18T22:57:14.330 回答
7

C#。它是命令式的,可以很方便,但也有很多功能特性。Lambda、迭代器和 LINQ 都是函数式的。

它可能对纯粹主义者没有太大吸引力,但它对我有用。

于 2009-06-18T23:43:39.027 回答
7

JavaScript、Python 和 Ruby 可以以这种方式使用,但Scala通过静态键入函数并在 JVM 下工作,提高了一个档次。

于 2009-06-18T23:03:48.280 回答
4

你真的问错问题了。您的问题的前提是“OO”和“功能”编程之间存在区别。这种区别既不有趣也不相关。事实上,按照“支持一流函数”的标准,即使是Java 也是函数式的。

但是你用“纯粹的功能”一针见血。这是有趣的一点。哪些语言可以为您提供这样的参考透明度和纯度?嗯,他们中的大多数,如果你非常小心的话。但实际上并没有多少能保证你的函数是纯的。我只能想到几种可以为您提供这种功能的语言。

其中之一是Haskell。在 Haskell 中,您编写的程序从头到尾都是纯函数式的。副作用被委托给称为 IO 的数据结构,状态通过纯函数传递或封装在 monad 中来处理。所以你有你的“调试天堂”,你的代码只有一小部分与全局状态交互,而你的程序的其余部分是纯的,并且纯由语言强制执行。

于 2009-06-18T23:40:58.890 回答
3

只要你不坚持“纯粹”,Common Lisp 就能满足你的所有需求。

于 2009-06-19T01:30:08.063 回答
1

Python、javascript、common lisp、ruby、smalltalk、haskell 和 ocaml,让我一头雾水。这不是一个真正的异国情调的组合。

于 2012-08-17T22:46:40.143 回答
0

我想知道为什么您要寻找一种特别鼓励将其混合在一起的语言,而不是仅仅使用一种可以很好地进行函数式编程和 OO 编程的语言来做它?它可以通过 Python、Ruby、Perl 或类似的解释语言轻松实现。此外,基于 C 的 OO 语言倾向于将纯 C 与 OO 特性混合在一起,例如,如果您选择,Objective C 可以很容易地以这种方式编写。

编辑:我已经意识到我不正确,我把这个答案留在这里,以防有人可以从我的错误中吸取教训 - 请参阅评论。

于 2009-06-18T23:09:02.763 回答
0

根据我的经验,C# 非常适合此目的。在 c# 中,您可以委托函数,甚至使用扩展方法,您也可以模仿 OOP 行为,但要考虑 FP。

我通常构建一个具有我需要的行为的类,然后构建一些函数来使用 FP 实践围绕它做一些肮脏的工作,这很好用,正如你提到的调试天堂。

在我看来,Pure FP 和 Pure OOP 都带来了一些其他人不会的缺点。OOP 倾向于使代码复杂化,而 FP 使某些企业更难编写代码,尤其是在状态至关重要的时候。

于 2021-11-13T06:00:43.760 回答
-1

红宝石!在 Ruby 中,一切都是对象(甚至是文字),并且它还具有完整的函数式编程支持。

于 2009-06-18T22:58:06.700 回答