10 回答
函数式语言适用于你想用它们做的任何事情。
然而,如今开发应用程序并不像使用编程语言那么简单。Java、C# 等的优势在于它们带有大型库和其他在构建业务软件时绝对需要的环境细节。大多数函数式语言都没有那么大的支持(到目前为止?)。
F# 可能很有前途,因为它在 .NET 环境中并且可以利用那里可用的工具(如果我错了,请纠正我)。
本文描述了 Lisp,一种早期的函数式语言,是如何成功地用于创建基于 Web 的应用程序的。
函数式语言非常适合 Web 应用程序开发,尤其是 Scala。
查看Lift框架以获取更多信息。
2) 功能语言是否适合业务/ERP/CRM 类型的应用程序?
为了解决关于业务/ERP/CRM 应用程序的第二点:我个人不会用像 Haskell 这样的“纯”函数式语言或像 Clojure 这样的动态函数式语言来实现这些。另一方面,我目前正在 Scala 中实现一个 ERP,它当然是混合 OOP/FP 和静态编译的。
我这么说的原因是,像 ERP 这样的业务应用程序基本上是面向记录的:有一个数据模式表示不同的记录类型,然后应用程序逻辑几乎完全围绕对这些记录进行 CRUD 设计,并将自定义业务工作流应用于它们。从根本上说,我不认为这些以数据为中心的业务应用程序非常适合功能模型。
人们可以随心所欲地谈论 OOP 关系不匹配,但最终 OOP 和数据库都是面向记录的:具有良好 ORM 的 OOP 语言允许您将这些不同的数据模型映射到您的代码中,然后附加代码来处理每个楷模。并且具有这种静态类型(理想情况下使用像 Scala 的 squeryl 之类的强类型 ORM)会大大减少运行时错误的可能性,或者例如对未通过代码正确应用的数据模型之一的更改。
不要误会我的意思——我是 FP 的忠实粉丝(我越来越多地在 Haskell 中进行系统编程),但对我来说,面向记录的 OOP 方法比面向函数的方法更有意义FP 用于处理业务 ERP 或类似的数据对象。(Scala 是该规则的一个很好的例外,因为您可以使用带有质量 ORM 的 OOP 范式来进行记录操作,而且还可以使用 FP 来进行一般的应用程序编程。)
- 是的,Nitrogen 是功能性 Web 框架的一个很好的例子。它也可以缩放。
Yaws是一个出色的 Erlang Web 服务器。
虽然我不会说任何特定的函数式语言都是为进行 Web 开发而量身定制的,但我也不会说你不能使用函数式语言进行 Web 开发。我认为这完全取决于您选择的语言可以使用哪些 Web 框架,以及是否有任何 Web 服务器支持该语言。
例如,我确信您可以在 IIS 上使用 F# 和 ASP.Net 来进行 Web 开发。我怀疑模板引擎是否支持 F#,但您绝对可以在 F# 中编写业务逻辑。
同样,mod_haskell
对于 Apache,它应该可以相对容易地使用 haskell 进行动态输出。虽然,我从来没有亲自使用过它。同时,如果有mod_(erlang or scala)
Apache 的,对于那些语言来说同样容易。
最终,我认为函数式语言的无状态特性应该使其非常适合无状态、MVC 风格的 Web 框架。然而,我认为这真的归结为在使用这些语言时可以使用哪些工具和框架来让你的生活更轻松。例如,在 Rails 流行之前,Ruby 在 Web 开发中并没有真正流行,而在我发现 django 之前,我并不真正喜欢用 Python 做任何 webby。
函数式语言提供了可用于 Web 开发的新型抽象。例如,基于延续的 Web 服务器在函数式语言中很流行。PLT Scheme Web 服务器支持这种 Web 应用程序开发。您可以在wikipedia上阅读更多关于 continuation 及其在 Web 开发中的用途的信息
大多数功能语言,即您包含的那些,都被认为是通用语言。对于 Web 开发,我会深入考虑使用 Clojure 或 Scala。它们都有非常好的 Web 框架,并且都运行在 JVM 上。我完全可以推荐 Clojure 和 Scala,但对其他的就不那么推荐了。
Haskell 有一个 web 框架,但我从未使用过它。
商业应用?当然,为什么不呢。函数式语言几乎适用于任何事情。
函数式语言的支持者声称的最大优势之一是它们使编写可以并行执行的程序变得更加容易。但是 Web 应用程序通常不存在并行性问题。通常,Web 服务器/应用程序服务器维护一个线程池,每个用户请求被分配到一个不同的线程,该线程可以在不同的物理处理器上运行。因此,您可以毫不费力地利用多个处理器。诀窍在于,Web 应用程序的特点是大量的小请求,并且线程和命令式语言在那里运行良好。当您有少量计算量大的请求时,命令式语言开始崩溃的地方。
函数式语言的另一大优势是,由于函数没有副作用,因此测试更容易。您在几个输入中单独测试每个功能,并且您知道系统将工作。但是,有一个问题。如果您的操作涉及输入或输出,那么您将使用 monad 而不是函数,并且您将失去该部分代码的可测试性优势。
但是,通常 Web 应用程序涉及从请求中读取信息、向数据库发出请求、从数据库中读取响应以及格式化响应。那是很多很多的 IO 或 monad,而函数的机会很少。
鉴于 Web 应用程序的这些特性,函数式语言为 Web 应用程序编程带来了哪些好处?