我想开始进行某些形式的网络开发,目的是构建最终可能成为初创产品的网络应用程序。很长一段时间以来,我一直对函数式编程非常好奇,而且在我心里的某个秘密地相信在你的抽象层次上越高,你拥有越多的权力(隐藏的假设:函数式编程比程序更抽象。
因此,鉴于我的网络开发经验很少,是否有任何功能性语言/框架可以开始,用于学习Web开发?
替代方案是坚持使用成熟的程序化Web框架(可能是Django),首先学习Web开发的绳索,然后考虑函数式编程。但是,如果我最终切换到函数式编程,那么所有的工作都会被“浪费”。
我对C ++,Objective-C / Cocoa,熟悉Python有很好的经验。
编辑: 很多人建议使用F#。但我很乐意(对其他人没有冒犯),远离.NET平台和其他MS生态系统。
答案 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)
答案 6 :(得分:2)
SML服务器是Apache的插件,允许您使用标准ML编写,通用functional language。
答案 7 :(得分:2)
Yesod已超过1.0。
(把这个迟到的答案放在一边只是因为谷歌仍在向人们(像我这样)展示这个老问题。)
答案 8 :(得分:0)
很长一段时间以来,我一直对函数式编程非常好奇,而且在我心里的某个秘密地相信你在抽象级别上越高,你拥有越多的权力(隐藏的假设:函数式编程比程序)。
这种“更高的抽象能力”可能只适用于您自己编写的代码。许多框架/工具都有帮助程序,例如用于UI数据绑定或数据库映射的代码生成。生成的代码不起作用。
我不知道一个具有与ASP MVC / DotNetNuke / Ruby Rails相同功能的100%功能的Web框架。
答案 9 :(得分:-1)
你应该先花一些时间在Seaside开发。看看James Foster写的教程。它似乎是具有社区的最高级别的Web框架