函数式编程是否与Web开发有关?
我最近看到了很多函数式编程,Clojure看起来特别有趣。 当我“理解”它的基本描述的时候,我无法弄清楚,如果我可以的话,我将如何在日常的基础上使用它作为web开发者。 我所阅读的很多内容都集中在函数式编程的math方面,而不是常规OO中的典型编程情形。
我有没有得到棒的错误结局? 函数式编程完全与Web开发无关吗? 如果没有,是否有任何使用“networking”的例子?
我的头顶上有几个例子:
- 雅虎 商店由Lisp(在收购之前最初名为Viaweb )提供支持,
- Reddit在Lisp中完全原型化,尽pipe2005年他们改用Python
- 黑客新闻完全是用Arc(一种Lisp方言)编写的,
函数式编程非常适合Web应用程序。 networking应用程序收到一个HTTP请求,并产生一个HTML结果。 这可以被视为从请求到页面的function。
与桌面应用程序(我们通常有一个长时间运行的进程)比较,在几个方向上有状态的UI和数据stream。 这更适合于关注具有状态和消息传递的对象的OO。
我不明白为什么不这样做 – 只要你向浏览器提供符合标准的HTML,他们不会在意你用什么来制作它,是一种function性语言,一种命令性语言还是受过训练的猴子。
纯函数式编程可能无法很好地映射到Web编程环境中。 但主要的障碍是缺乏基础设施(框架和API)。 在function语言像Java,Python或Ruby这样的Web编程环境丰富之前,这将是一个很长的时间(可能从来没有,诚实地说)。
这就是说,有一些select。
- HAppS – 一个Haskell Web应用程序服务器
- Haskell服务器页面
- 链接 – 一种function性的networking编程语言
- mod_caml – 一个Apache的OCaml CGI模块
- Ocsigen / Eliom – OCamlnetworking服务器/编程框架
- OPA – 一个商业Web应用程序框架
- Yesod – Haskell的一个Web框架
我没有任何这方面的经验。 也许评论者可以权衡他们的工作。
Twitter重写了Scala的后端 ,这是一种支持面向对象和function范式的JVM语言。
另外, Lift web框架是用Scala编写的。
对于Clojure,使用Clojure和Google App Engine开发的一个有趣的启动(TheDeadline)。 他们在Slideshare上有一个很好的PPT,并在InfoQ上接受采访。
关于用GAE部署Clojure的一个很好的讨论: http : //news.ycombinator.com/item? id= 1239788
据我所知,Clojure有一些网页开发库。 Compojure戒指Conjure
希望这回答你的一些问题=)(我刚刚开始了..)
最好的,瑞安
这与网站开发并不完全无关。 坐在服务器上的应用程序可以很好地利用闭包,高阶函数,不变性,参照透明度等function性function。例如,您确定拥有您需要以任何方式进行转换或操作的集合。 函数式编程在这里有所帮助,它的成语正在渗透主stream语言。 function特性有助于简洁性,可testing性和并行性,并且它们还可以提供本地解决scheme,以解决您可能通过模式解决的问题。
更新:也有function语言的Web框架。 Common Lisp的Weblocks,Scala的电梯。 这些是我听说过的,可能还有更多的…但是你不一定要纯粹的function – 例如Scala是不纯粹的,应该与任何Java框架工作,你仍然可以为业务层使用函数式编程等
语言和范例对于networking应用来说并不重要,它们同样好而坏。 如果您正在寻找学习新范式的理由,那么请深入研究。我的build议是分析您尝试解决的问题并select适当的工具集。
查看Ur / Web 。 它非常快速,它的静态types系统知道诸如HTML和SQL之类的东西,所以它可以保证各种关于安全性的好事。
Erlang似乎在一些可扩展的Web应用程序的基础架构中得到了很多的使用。 CouchDB和Riak数据库大部分是用Erlang编写的,RabbitMQ消息队列服务器也是如此。 其成功的关键之一是它通过消息传递处理并发性,没有共享的可变状态。 正是这种思考问题的方式比任何特定的函数式编程语言更有用。
或者,看看MapReduce。 即使您的映射和reduce函数恰好处于内部状态,这也是查看计算的一种非常实用的方法 – 因此,以容错,分布式方式查询大型数据集是非常合适的。
通过一切手段,去任何最实际的东西给你。 但始终保持function性编程在你的脑海里,因为你永远不知道什么时候可以派上用场。
Javascript(网页FE部分的语言和BE越来越多)本身不具有function,但function是一阶function
他们在爱丁堡大学做了一些非常酷的事情,并为networking进行function性编程。
另一个简短的回答: http : //www.mlstate.com – 基于FP的完整的Web开发平台。 语言的清晰语义允许进行各种自动化的安全和安全分析,优化等。
警告:我在那里工作。
我们刚刚发布了一个在线电子表格,后端完全是用Erlang编写的。
按照任何标准,这是最复杂的networking应用程序之一,你可以build立一个巨大的GUI复杂的心态。
以下是使用Haskell构buildWeb应用程序的Web开发人员的经验。 虽然function语言是非常安全的并且具有良好的并发性,但是它们始终缺乏最好的api,因为它早已成为学术界的宠儿,而且还没有被现实世界所接受。 我希望这不是太遥远。 Erlang已经进入了它。
函数式编程在networking编程中受欢迎的原因是它描述了共享和变化的状态,允许程序员将纯function性的部分表示为纯函数。 纯函数的优点是并行运行非常简单 – 因为它们没有任何副作用。
至less这是我的理由。
函数式语言可能不适用于构build优秀的应用程序,但我们大量使用函数式编程范例来构build我们的应用程序。 纯函数式编程提出了“无副作用”的约束。 这确保了纯粹的函数调用将会以相同的顺序产生相同的结果。 这对于Web开发来说并不理想,但是如果函数式编程与状态更改系统结合使用,则可以构build健壮的Web应用程序。 看看我的论文了解更多细节: FAST Server也是这些幻灯片 。
你可能不会使用它,不应该使用它,但是当你说某人总是会发现规则(Viaweb等)的例外。 基本上没有“超级语言”,只有代码行,通常在“Blub”。 就连保罗·格雷厄姆(Paul Graham)也表示,Lisp的主要(实际上只是)好处在于能够快速build立原型。
另外,“超级语言”通常会影响而不是增加代码可读性,这意味着写一个“天才”的人必须永远保持它,因为没有其他人能够理解它,尤其是因为他可能会用自己修改后的方言来写。 这就减less了任何项目的可能范围,这意味着即使可以完成新的,创新的事情,它们也是不可扩展的,因此保持在相对较小的范围内(如“黑客新闻”)。
这并不是说有人不能有天才的想法,并以难以理解的方式来实现,然后可以在Blub中重写,并延伸到很多人可以从中受益。 事实上,Lisp的所有成功案例都是如此,更不用说每一个有生之年的着名哲学家。 但是,当然,如果你是一个“天才”,你也可以通过其他方式对产品进行原型devise。
至于JVM上的FP,可能有限但很酷的东西。 虽然我个人只会用它来进行原型devise,但是可能会有一个用例(通常与multithreading有关),它可以提供一些改进。