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

iva*_*ble 6 django functional-programming

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

因此,鉴于我所拥有的小型Web开发经验,是否有任何功能性语言/框架可以开始学习Web开发

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

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

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

Chu*_*uck 10

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

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


R. *_*des 7

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

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

你也可以看看F#Web工具,正如itowlson建议的那样.


Cal*_*leb 3

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

尽管使用 haskell,应用程序需要编译和部署(在服务器上或在类似于服务器的环境中编译)。

我最近在玩这个……总的来说,我觉得这并不比使用正常的(从统计学上来说)语言难多少。下面是代码的示例(遵循某种 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
    ))
Run Code Online (Sandbox Code Playgroud)

数据.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
Run Code Online (Sandbox Code Playgroud)

视图.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
        ]
    ]
Run Code Online (Sandbox Code Playgroud)