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

时间:2009-06-18 22:55:44

标签: scala functional-programming imperative-programming

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

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

到目前为止,我发现Scala虽然我刚刚听说过它(它看起来很神奇)。在这种“混合风格”范式中是否有任何重要的竞争者?

12 个答案:

答案 0 :(得分:20)

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

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

像Python和Ruby这样流行的脚本语言也可以让你以功能风格编程。但是,它们没有提供“经典”函数语言(以及OCaml)具有的最强大的功能之一:pattern matching(不要将其误认为正则表达式)。

答案 1 :(得分:20)

Javascript:OOfunctional

答案 2 :(得分:12)

此外,Python,Ruby,Lua等许多脚本语言都具备此功能,但缺少函数式语言的许多优点,如代数数据类型和模式匹配。

答案 3 :(得分:9)

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

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

答案 4 :(得分:9)

Haskell :纯粹功能性,几乎没有OO,但请继续进行潜水。 :d

Scala :OO和FP的美妙组合,可能会在十年或二十年内超越Java作为JVM上的首要语言。我喜欢它,因为它为java平台带来了函数式编程,这是非常需要恕我直言。

C#:对OO的强大支持,以及获得更多功能(一流的功能,我们将看到.net 4带来了哪些改进)

F#:.net语言专为功能而设计,而不是最初为OO设计的C#。

Python :非常适合OO,但not at all suited to FP

Javascript :支持一流的功能,但不是专为FP设计的,如Scala和F#。仍然比python恕我直言要好。

为什么要混合使用OO和FP?作为踏脚石?

答案 5 :(得分:7)

JavaScript,Python和Ruby可以这样使用,但Scala通过静态键入函数并在JVM下工作来提升一个档次。

答案 6 :(得分:7)

C#。这是必要的,它可以很方便,但也有很多功能特性。 Lambda,迭代器和LINQ都是有用的。

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

答案 7 :(得分:3)

你真的在问错误的问题。你的问题是以“OO”和“功能”编程之间的区别为前提的。这种区别并不有趣或相关。实际上,根据“支持一流功能”的标准,甚至是Java is functional

但是你用“纯粹功能性”击中了头部。这是有趣的一点。哪种语言为您提供参考透明度和纯度?好吧,其中大部分,如果你非常小心。但实际上并没有多少人保证你的功能是纯粹的。我只能想到几种能为你提供这种语言的语言。

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

答案 8 :(得分:3)

只要您不坚持“纯度”,Common Lisp就会满足您的所有需求。

答案 9 :(得分:0)

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

编辑:我被告知我错了,我已经把这个答案留在了这里,因为有人可以从我的错误中吸取教训 - 见评论。

答案 10 :(得分:0)

Python,javascript,常见的lisp,ruby,smalltalk,haskell和ocaml,脱颖而出。它并不是一个奇特的组合。

答案 11 :(得分:-1)

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