有哪些语言可以同时促进面向对象和函数式编程?我知道任何支持一流函数的语言都可以被认为是函数式的,但我正在寻找一种专门针对两种编码风格的语法。
使用这样的语言,我想象将所有状态更改隔离到单个代码部分,并让程序的其余部分纯粹是功能性的。光是想想就让我流口水(调试天堂!)。
到目前为止,我已经发现了Scala,尽管我只是听说过它(而且它看起来很棒)。在这种“混合风格”范式中是否有任何大的竞争者?
有哪些语言可以同时促进面向对象和函数式编程?我知道任何支持一流函数的语言都可以被认为是函数式的,但我正在寻找一种专门针对两种编码风格的语法。
使用这样的语言,我想象将所有状态更改隔离到单个代码部分,并让程序的其余部分纯粹是功能性的。光是想想就让我流口水(调试天堂!)。
到目前为止,我已经发现了Scala,尽管我只是听说过它(而且它看起来很棒)。在这种“混合风格”范式中是否有任何大的竞争者?
此外,许多脚本语言(如 Python、Ruby、Lua 等)具有此功能,但缺少函数式语言的许多优秀特性,例如代数数据类型和模式匹配。
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?
据我所知,OCaml 和 F# 是最流行的混合 OOP 和 FP 的语言。
大多数语言,比如 Ruby,都混合了函数式编程,但很多人甚至没有意识到这一点。我发现像这样的语言在语法方面还有很多不足之处。
C#。它是命令式的,可以很方便,但也有很多功能特性。Lambda、迭代器和 LINQ 都是函数式的。
它可能对纯粹主义者没有太大吸引力,但它对我有用。
JavaScript、Python 和 Ruby 可以以这种方式使用,但Scala通过静态键入函数并在 JVM 下工作,提高了一个档次。
你真的问错问题了。您的问题的前提是“OO”和“功能”编程之间存在区别。这种区别既不有趣也不相关。事实上,按照“支持一流函数”的标准,即使是Java 也是函数式的。
但是你用“纯粹的功能”一针见血。这是有趣的一点。哪些语言可以为您提供这样的参考透明度和纯度?嗯,他们中的大多数,如果你非常小心的话。但实际上并没有多少能保证你的函数是纯的。我只能想到几种可以为您提供这种功能的语言。
其中之一是Haskell。在 Haskell 中,您编写的程序从头到尾都是纯函数式的。副作用被委托给称为 IO 的数据结构,状态通过纯函数传递或封装在 monad 中来处理。所以你有你的“调试天堂”,你的代码只有一小部分与全局状态交互,而你的程序的其余部分是纯的,并且纯由语言强制执行。
只要你不坚持“纯粹”,Common Lisp 就能满足你的所有需求。
Python、javascript、common lisp、ruby、smalltalk、haskell 和 ocaml,让我一头雾水。这不是一个真正的异国情调的组合。
我想知道为什么您要寻找一种特别鼓励将其混合在一起的语言,而不是仅仅使用一种可以很好地进行函数式编程和 OO 编程的语言来做它?它可以通过 Python、Ruby、Perl 或类似的解释语言轻松实现。此外,基于 C 的 OO 语言倾向于将纯 C 与 OO 特性混合在一起,例如,如果您选择,Objective C 可以很容易地以这种方式编写。
编辑:我已经意识到我不正确,我把这个答案留在这里,以防有人可以从我的错误中吸取教训 - 请参阅评论。
根据我的经验,C# 非常适合此目的。在 c# 中,您可以委托函数,甚至使用扩展方法,您也可以模仿 OOP 行为,但要考虑 FP。
我通常构建一个具有我需要的行为的类,然后构建一些函数来使用 FP 实践围绕它做一些肮脏的工作,这很好用,正如你提到的调试天堂。
在我看来,Pure FP 和 Pure OOP 都带来了一些其他人不会的缺点。OOP 倾向于使代码复杂化,而 FP 使某些企业更难编写代码,尤其是在状态至关重要的时候。
红宝石!在 Ruby 中,一切都是对象(甚至是文字),并且它还具有完整的函数式编程支持。