混合面向对象和函数式编程

36
有哪些语言既支持面向对象编程又支持函数式编程?我知道任何支持一级函数的语言都可以被认为是函数式的,但我正在寻找一个特别针对这两种编程风格的语法。
使用这样的语言,我想将所有状态更改隔离到代码的一个部分,并使程序的其余部分纯粹是函数式的。仅仅想想就让我流口水(调试天堂!)。
到目前为止,我发现了Scala,尽管我刚刚听说它(看起来很棒)。在这种“混合风格”范例中是否存在其他大型竞争者?

1
我不喜欢那种混合式的语言,这对我毫无意义。我现在正在学习 Haskell ,然后我将更深入地了解 Clojure 。我的两种最喜欢的编程语言! :D - Rayne
我用过Clojure,对于一个前Lisper来说非常棒!也许我会和你相反,学习Haskell。 - Kai
1
+1 我完全同意将状态更改隔离到程序的专用部分,并在其他地方进行功能性处理的想法(或者反过来;Kent Beck称其为“数学微观世界”)。 - ThomasH
13个回答

23

使用Coffeescript可以使函数式编程的体验更好。 - scrwtp

22

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

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

像Python和Ruby这样的常见脚本语言也允许您以函数式编程风格编程。然而,它们没有提供“传统”的函数式语言(以及OCaml)拥有的最强大的设施之一:模式匹配(不要将其与正则表达式混淆)。


8
OCaml和F#在语法方面几乎和Haskell一样漂亮,但它们不允许你抽象出类型构造器(没有高阶类型)。Scala的语法不太漂亮,但它提供了高阶类型。如果你只是想写更漂亮的代码,那没问题,但如果你想要更强大的抽象能力,Caml变体将无法满足你的需求。 - Apocalisp

12

11
:纯函数式,几乎没有面向对象,但是可以尝试一下。:D

Scala:优美的面向对象和函数式混合,可能在未来十年或二十年内超过Java成为JVM的首选语言。我喜欢它,因为它将函数式编程带到了Java平台上,我认为这是非常需要的。

C#:非常支持面向对象,同时也越来越支持函数式(已经有头等函数了,我们会看到.net 4会带来什么改进)。

F#:.net语言专门设计用于函数式编程,而不像C#最初是为面向对象而构思的。

Python:非常适合面向对象,但不太适合函数式编程

Javascript:支持头等函数,但并不像Scala和F#那样专为函数式编程而设计。在我看来仍然比Python略好一些。

为什么要混合面向对象和函数式编程?作为一个过渡阶段吗?


10
为什么要混合面向对象和函数式编程?-因为这就是我们的世界。有些方面可以用永恒关系很好地建模,而其他方面则需要考虑生命周期和状态。 - ThomasH

9

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

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


7

JavaScript、Python和Ruby可以这样使用,但是Scala通过静态类型的函数和在JVM下工作来提高了一级。


26
为什么有人会选择使用Python学习函数式编程呢?:\ - Rayne

7

C#。它是一种命令式语言,具有很多实用的功能性特点,如Lambda表达式、迭代器和LINQ。

它可能不太吸引纯粹主义者,但对我来说很有效。


那最后一部分是我开玩笑的想法。一般来说,我不是一个“纯粹主义者”。显然,有些人感到冒犯了。 - Scott Wisniewski
我并不是有意冒犯任何人。 - Scott Wisniewski
4
我不认为这会冒犯任何人,但是它已经吸引了一些“冒犯性”的投票;我建议您重新措辞最后一点。这相当可悲(不是针对斯科特,而是针对那些“被冒犯”的人),因为这篇文章显然并没有“冒犯”之处。但我们就是这样。 - Marc Gravell

4
您��问题有些不恰当。您的问题基于“面向对象”和“函数式”编程之间存在区别。这个区别并不有趣或相关。实际上,根据“支持一等函数”的标准,甚至Java也是函数式的。
但是,“纯函数式”编程确实很有意思。哪些语言提供了像它那样的引用透明度和纯洁性呢?嗯,大多数语言都可以,如果你非常小心。但是并不是所有语言都保证您的函数是纯的。我只能想到几种提供此功能的语言。
其中之一就是Haskell。在Haskell中,您编写的程序从头到尾都是纯函数式的。副作用委托给一个称为IO的数据结构处理,并且状态通过纯函数传递或封装在单子中处理。因此,您拥有“调试天堂”,只有一小部分代码与全局状态交互,而您程序的其余部分都是纯的,并且语言强制执行纯洁性。

我关注的不是纯度,而是可读性。我知道许多语言支持许多编程风格,但一种语言的语法在很大程度上决定了哪种风格被广泛接受。我认为Scala是我见过的第一种同时追求两者的语言! - Kai
回答问题时过于学究,没有真正回答问题,这是不好的。 - ThomasH

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

4
除非你需要静态类型检查。 - Apocalisp
对于静态类型和动态类型,我有些犹豫。个人而言,我非常喜欢Clojure和Haskell。 - Rayne
嗯,静态类型和真正的面向对象是矛盾的。你不能拥有一切。 - Svante
经过将近两年的时间重新审视这个问题:静态类型和动态类型并不是相互排斥的。没有人会阻止你在编译时推断和检查类型,这也是现代大多数Common Lisp实现所做的(同时支持程序员声明)。动态类型只意味着你还有一个在运行时工作的类型系统。 - Svante

1
Python、JavaScript、Common Lisp、Ruby、Smalltalk、Haskell 和 OCaml,这些是我能想到的。这并不是什么奇怪的组合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接