我可以使用函数式语言开始Web开发吗?

时间:2009-12-02 21:03:54

标签: django functional-programming

我想开始进行某些形式的网络开发,目的是构建最终可能成为初创产品的网络应用程序。很长一段时间以来,我一直对函数式编程非常好奇,而且在我心里的某个秘密地相信在你的抽象层次上越高,你拥有越多的权力(隐藏的假设:函数式编程比程序更抽象。

因此,鉴于我的网络开发经验很少,是否有任何功能性语言/框架可以开始,用于学习Web开发

替代方案是坚持使用成熟的程序化Web框架(可能是Django),首先学习Web开发的绳索,然后考虑函数式编程。但是,如果我最终切换到函数式编程,那么所有的工作都会被“浪费”。

我对C ++,Objective-C / Cocoa,熟悉Python有很好的经验。

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

10 个答案:

答案 0 :(得分:10)

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

(免责声明:我自己并没有使用过Ocsigen,但我听说过它很棒。这是我要做的事情清单。)

答案 1 :(得分:7)

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

我在ASP.NET MVC的Web开发中迈出了第一步,我发现它很简单。

你也可以看看F# Web Tools,正如itowlson所建议的那样。

答案 2 :(得分:4)

  

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

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

答案 3 :(得分:3)

使用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
    ))

Data.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
        ]
    ]

答案 4 :(得分:3)

这有点偏离障碍而不是严格的功能语言,但您可能需要考虑erlang

Erlang有一个非常好的框架Erlyweb,它自己的网络服务器名为Yaws

它功能强大,并且为并发性提供了惊人的东西,但与其他语言相比,这是一个非常大的心理转变。

答案 5 :(得分:2)

  • Ruby功能有点,所以你可以使用备受推崇的Rails框架(虽然它本身并不特别实用)
  • 我不确定Seaside是如何在内部构建的,但它可能值得一看。 (Ruby和Smalltalk是OO语言,其中可以进行函数式编程,而不是主要的函数式语言。)
  • 这是a discussion on Haskell web frameworks

答案 6 :(得分:2)

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

http://www.smlserver.org/

答案 7 :(得分:2)

Haskell中的

Yesod已超过1.0。

(把这个迟到的答案放在一边只是因为谷歌仍在向人们(像我这样)展示这个老问题。)

答案 8 :(得分:0)

  

很长一段时间以来,我一直对函数式编程非常好奇,而且在我心里的某个秘密地相信你在抽象级别上越高,你拥有越多的权力(隐藏的假设:函数式编程比程序)。

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

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

答案 9 :(得分:-1)

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