【问题标题】:Can I start web development with a functional language?我可以使用函数式语言开始 Web 开发吗?
【发布时间】:2009-12-02 21:03:54
【问题描述】:

我想开始做一些形式的 Web 开发,目的是构建最终可以发展成为初创产品的 Web 应用程序。而且一直以来,我一直对函数式编程很好奇,心里的某个地方暗暗相信抽象层次越高,你的权力就越大(隐藏的假设:函数式编程比程序更抽象)。

鉴于我的网络开发经验很少,有没有什么函数式语言/框架可以很好地开始,学习网络开发

另一种选择是坚持使用成熟的过程式 Web 框架(可能是 Django),先学习 Web 开发的技巧,然后再考虑函数式编程。但是,如果我最终转向函数式编程,所有的工作都将“浪费”。

我在 C++、Objective-C/Cocoa 方面有很好的经验,熟悉 Python。

编辑: 很多人建议使用 F#。但我愿意(无意冒犯他人)远离 .NET 平台和其他 MS 生态系统。

【问题讨论】:

  • ASP.NET MVC + F# 将是一个很好的匹配。
  • yahoo stores 最初是用 lisp 编写的。有一篇关于它的著名保罗·格雷厄姆文章。 paulgraham.com/avg.html
  • @Breton:ASP.NET MVC 不像它的“邪恶”兄弟 ASP.NET Web 窗体。我认为您不会因为使用 MVC Web 框架而失去函数式语言的任何东西。
  • F# 受 OCaml 的影响比 Haskell 大得多。它基本上是一个精简的 OCaml,具有更好的库。我看到的唯一 Haskell 影响是它具有内置的组合和应用程序运算符。
  • 你最好在不同的环境中学习你的函数式语言 - Web 开发是函数式编程的一个不错的领域,但除非你正在学习课程,否则你会发现这门学科真的令人困惑。构建网页不会明确地教你真正重要的部分。看看 SICP 和弟兄们。 mitpress.mit.edu/sicp

标签: django functional-programming


【解决方案1】:

您可能对Ocsigen 感兴趣,这是OCaml 的Web 框架。 OCaml 是一种非常好的学习函数式编程 IMO 的语言。它的功能非常强大,不像 Ruby 或 Python 或任何其他命令式 OO 语言,人们会试图向您推销“能够进行函数式编程”(他们只是说它具有一流的功能)。

(免责声明:我自己并没有经常使用 Ocsigen,但我听说过它的好消息。它在我的待办事项清单上。)

【讨论】:

    【解决方案2】:

    您可以学习 F# 作为您的函数式语言和 ASP.NET MVC 作为您的 Web 框架。这使您可以访问 .NET 框架中的工具和库。

    我在使用 ASP.NET MVC 进行 Web 开发方面迈出了第一步,我发现它很容易上手。

    您也可以按照 itowlson 的建议查看 F# Web Tools

    【讨论】:

      【解决方案3】:

      我不知道有一个 100% 功能与 ASP MVC / DotNetNuke / Ruby Rails 相同功能的 Web 框架。

      Scala(一种混合的面向对象和函数式语言)有一个名为 Lift 的框架,它类似于 Rails。

      【讨论】:

      【解决方案4】:

      这有点离题,不是严格的函数式语言,但您可能需要考虑erlang

      Erlang 有一个相当不错的框架,名为 Erlyweb,它自己的网络服务器名为 Yaws

      它功能强大,并为并发提供了惊人的功能,但与其他一些语言相比,这是一个非常大的思维转变。

      【讨论】:

      • Erlang 可能是我最不喜欢的“主流”函数式语言,但由于它的可扩展性,它对于 Web 应用后端来说是一个令人信服的选择。
      【解决方案5】:

      有了 Haskell,当然可以使用 CGI 来编写 Web 应用程序。见:

      虽然使用haskell applications need to be compiled and deployed(在服务器上编译或在类似于服务器的环境中编译)。

      我最近玩过这个……总的来说,我觉得这并不比使用普通(从统计上来说)语言困难得多。下面是代码可能看起来的示例(遵循一种 MVC 方法):

      CGI.hs:

      module CGITest.CGI where
      
      import Network.CGI
      import qualified CGITest.Views as V
      import qualified CGITest.Data as D
      
      cgiMain = runCGI (handleErrors (do
          rows <- liftIO D.getAllData
          output $ V.drawPage $ V.drawTable rows
          ))
      

      数据.hs:

      module CGITest.Data where
      
      import qualified Data.Map as Map
      import Database.HDBC
      import Database.HDBC.Sqlite3
      
      getAllData :: IO [Map.Map String SqlValue]
      getAllData = do
          conn <- connectSqlite3 "C:\\Personal\\code\\Code\\Haskell\\CGITest\\test.db"
          statement <- prepare conn "SELECT * FROM Test"
          execute statement []
          rows <- fetchAllRowsMap statement
          return rows
      

      Views.hs:

      module CGITest.Views where
      
      import qualified Data.Map as Map
      import Data.Map ((!))
      import Prelude hiding (div, id)
      import Text.HTML.Light hiding (head)
      import qualified Text.HTML.Light as H
      import Text.XML.Light.Types (Content)
      import Text.XML.Light
      
      import Text.JSON
      import Text.JSON.String
      
      import Database.HDBC
      
      tbody z e = Elem (Element (unqual "tbody") z e Nothing)
      thead z e = Elem (Element (unqual "thead") z e Nothing)
      
      drawPage x = renderXHTML xhtml_1_0_transitional $
          html [] [
              H.head [] [
                  title [] [cdata "Testing Haskell CGI"]
              ],
              body [] [
                  div [id "outer-container"] [
                      div [id "inner-container"] x,
                      cdata $ show testJ
                  ]
              ]
          ]
      
      drawRow columns =
          tr [class' "row"] [
              td [] [cdata $ fromSql $ columns ! "id"],
              td [] [cdata $ fromSql $ columns ! "name"]
          ]
          where
              tId = "row-" ++ (fromSql $ columns ! "id")
      
      drawTable rows =
          [
              table [border "1"] [
                  thead [] [
                      tr [] [
                          th [] [cdata "ID"],
                          th [] [cdata "Name"]
                      ]
                  ],
                  tbody [] $ map drawRow rows
              ]
          ]
      

      【讨论】:

      • 也看看 happstack happstack.com ,背后有一些很棒的想法
      【解决方案6】:
      • Ruby 具有一定的功能性,因此您可以使用备受推崇的 Rails 框架(尽管它本身并不是特别实用)
      • 我不确定 Seaside 的内部结构如何,但可能值得一看。 (Ruby 和 Smalltalk 是面向对象的语言,可以在其中进行函数式编程,而不是主要的函数式语言。)
      • 这里是a discussion on Haskell web frameworks

      【讨论】:

        【解决方案7】:

        SML 服务器是 Apache 的一个插件,允许您使用标准 ML 编写,通用的functional language

        http://www.smlserver.org/

        【讨论】:

          【解决方案8】:

          Haskell 中的Yesod 已超过 1.0。


          (之所以加入这个迟到的答案,只是因为 Google 仍在向人们(比如我)展示这个老问题。)

          【讨论】:

            【解决方案9】:

            而且很长一段时间以来,我一直对函数式编程很好奇,心里某个地方暗自认为,抽象层次越高,你的权力越大(隐藏的假设:函数式编程比抽象更抽象)程序)。

            这种“更高的抽象能力”可能只适用于您自己编写的代码。许多框架/工具都有帮助程序,例如用于 UI 数据绑定或数据库映射的代码生成。此生成的代码将不起作用。

            我不知道有一个 100% 功能与 ASP MVC / DotNetNuke / Ruby Rails 相同功能的 Web 框架。

            【讨论】:

              【解决方案10】:

              您可能应该先花一些时间在 Seaside 进行开发。看看 James Foster 写的教程。它似乎是具有社区的最高级别的 Web 框架

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-11-16
                • 1970-01-01
                • 2010-12-14
                • 1970-01-01
                • 1970-01-01
                • 2010-10-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多