2008-05-26
用haskell 十分钟写一个wiki程序
好吧,我承认,标题是唬人的。用十分钟实现的这个小wiki还不具备全文搜索,智能推荐,启发式屏蔽关键词等等能力。
这几天用晚上的时间研究了下haskell的web应用,见前两天的 haskell + fastcgi 篇。所应用的就是基本的 fastcgi, dbm以及 XHtml 这几个模块。 从无到有自己实现 session以及url映射等基础组件,总共的功能代码不到100行吧。有了这个基本架子之后,在上面添加一个 wiki 功能,真的只用了十多(n)分钟。(Turbogears那个视频也很唬滥,他可是在一大堆现有的模块之上搞的,我好歹是从cgi搞起)
通过几天的实践,几点感受:
1. haskell 是门简单的语言,但很多入门读物都是具有医生头衔的人写的,上来就是monad,范畴论,组合子,要么就是写个解释器之类的,真的会吓到我这样的小白
2. haskell的类型确实是个好东西,类型检查可以在编译期间排除掉大部分的错误,所以基本上,只要程序能通过编译,不大需要调试的,因为类型检查强迫你按正确的用法使用各个模块
3. dbm 是sql hater的救星
代码片段1: (url 分发部分) 如果url 不在map里,就去wiki的 dbm 里面找,找不到的话,给一个创建页面,找到了的话,就现实这个页面。
而 Wiki 模块中的几个函数,简单到不忍心拿出来的地步:
从dbm 中找一个页面是否存在: (简直就是换了个函数名而已)
把一个新页写入 dbm 中:
显示wiki页面:
创建页面:
保存页面:
简陋的功能有了,现在可以访问一个不存在的url 然后显示一个创建页面,保存就ok了。 下面需要一个Index页,把所有已有的页面列出来:
下面这个函数生成一个 Html 类型的结果,内容为一个 div
这几天用晚上的时间研究了下haskell的web应用,见前两天的 haskell + fastcgi 篇。所应用的就是基本的 fastcgi, dbm以及 XHtml 这几个模块。 从无到有自己实现 session以及url映射等基础组件,总共的功能代码不到100行吧。有了这个基本架子之后,在上面添加一个 wiki 功能,真的只用了十多(n)分钟。(Turbogears那个视频也很唬滥,他可是在一大堆现有的模块之上搞的,我好歹是从cgi搞起)
通过几天的实践,几点感受:
1. haskell 是门简单的语言,但很多入门读物都是具有医生头衔的人写的,上来就是monad,范畴论,组合子,要么就是写个解释器之类的,真的会吓到我这样的小白
2. haskell的类型确实是个好东西,类型检查可以在编译期间排除掉大部分的错误,所以基本上,只要程序能通过编译,不大需要调试的,因为类型检查强迫你按正确的用法使用各个模块
3. dbm 是sql hater的救星
代码片段1: (url 分发部分) 如果url 不在map里,就去wiki的 dbm 里面找,找不到的话,给一个创建页面,找到了的话,就现实这个页面。
target <- liftIO $ HT.lookup mapping uriPath
case target of
Nothing -> do
-- missing page, find wiki
let wiki = dbmWiki env
wikiContent <- liftIO $ findWiki wiki uriPath
case wikiContent of
Nothing -> do
output $ showHtml $ pageNotFound uriPath
Just content -> do
output $ showHtml $ readWikiPage uriPath content
而 Wiki 模块中的几个函数,简单到不忍心拿出来的地步:
从dbm 中找一个页面是否存在: (简直就是换了个函数名而已)
findWiki dbm path = lookupA dbm path
把一个新页写入 dbm 中:
writeWikiPage dbm path content = do insertA dbm path content flushA dbm
显示wiki页面:
readWikiPage path cont = header << [
thetitle << path,
meta ! [httpequiv "Content-Type", content "text/html", strAttr "charset" "UTF-8"]
] +++
body << pre << cont
创建页面:
pageNotFound uri = page "Page Not found" b
where
b = body << [
h1 << "Page Not found",
form ! [method "POST", action "/createPage"] <<
[
h2 << "Page Content:",
textarea ! [name "content", cols "100", rows "25"] << "",
br,
hidden "path" uri,
submit "" "Submit"
]
]
保存页面:
createPage env sid = do
let dbm = dbmWiki env
method <- requestMethod
path' <- getInput "path"
content'<- getInput "content"
case maybe2 path' content' of
Nothing -> do
return (h1 << "miss field", "/")
Just (path, content) -> do
liftIO $ writeWikiPage dbm path content
return (h1 << "write ok", path)
简陋的功能有了,现在可以访问一个不存在的url 然后显示一个创建页面,保存就ok了。 下面需要一个Index页,把所有已有的页面列出来:
下面这个函数生成一个 Html 类型的结果,内容为一个 div
wikiIndex env sid = do
paths <- keysA dbm -- 把 dbm 的所有key 取出
-- div 由一个 h1 和一系列链接组成
return $ thediv << (h1 << "Wiki Index" +++ [ li << anchor ! [href p] << p | p <- paths])
where
dbm = dbmWiki env -- 获得 wiki的dbm handle
- 01:10
- 浏览 (185)
- 论坛浏览 (6412)
- 评论 (23)
- 相关推荐
评论
toostupid 写道
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?
以前我老师在15分钟就用haskell完成了一个编译器。
这个编译器帮我们把用haskell写的游戏逻辑直接编译成游戏语言。
是一个完整的编译器。
在研究的领域haskell是很强大的工具。
是用的 parsec 库写的吧。
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?
以前我老师在15分钟就用haskell完成了一个编译器。
这个编译器帮我们把用haskell写的游戏逻辑直接编译成游戏语言。
是一个完整的编译器。
在研究的领域haskell是很强大的工具。
albertlee 写道
可惜折腾了一晚上连它的安装包都没下载下来……
你是说 forth 还是 factor ?
factor 的话去 http://www.factorcode.org/getfactor.fhtml ,根据自己的系统下载、解压就行,不用安装。
是啊,我也是无意中认识了 forth 后,就被她深深的吸引,她的逆波兰表达式(与 lisp 的剑桥波兰表达式相映成趣,一个是“前”,一个是“后”。)、任意字符编程(真的是任意字符,只要你能敲出火星文字,你就可以用外星文字编程,用乱码也是可以的,不过要小心,这样的源代码可真的就是天书了。 ^_^)、极强的可扩展性(跨平台移植只要实现约 70-130 个“原语”,嵌入式系统可能只有 20 个不到。),还有基于堆栈的虚拟机,等等这些特性真的让人“疯狂”,夸张点说,这是一个“人机合一”的语言,因为用她编程,你要把你的脑子变成两个“堆栈”,呵呵!
就我自己来说,我认为真正有意思的编程语言只有两个(及她们的衍生物): lisp 与 forth,这两个语言非常古老,但都拥有对自身编程的能力,所以可以方便的添加本身所没有的现代编程特性,像 forth 给自己添加基本的面向对象支持,也就是几十行代码就差不多了。
不过自己实现总是麻烦,现在好了,有了 factor: 一个 lisp 与 forth 的综合体,还添加了许多现代的特性:对象、延续、erlang 样式的并发等等,还有她调用外部程序和部署应用的能力,比 haskell 和 erlang 可好得太多,当然这只是我个人的看法。
不知不觉把这帖子写得有点像广告了,见谅啊! :-)
就我自己来说,我认为真正有意思的编程语言只有两个(及她们的衍生物): lisp 与 forth,这两个语言非常古老,但都拥有对自身编程的能力,所以可以方便的添加本身所没有的现代编程特性,像 forth 给自己添加基本的面向对象支持,也就是几十行代码就差不多了。
不过自己实现总是麻烦,现在好了,有了 factor: 一个 lisp 与 forth 的综合体,还添加了许多现代的特性:对象、延续、erlang 样式的并发等等,还有她调用外部程序和部署应用的能力,比 haskell 和 erlang 可好得太多,当然这只是我个人的看法。
不知不觉把这帖子写得有点像广告了,见谅啊! :-)
indra 写道
factor 写道
都是在消磨这无聊的人生。。。。。。。。。哈哈
国内居然真有人在玩 factor 啊!实在太高兴了。
这东东可是个极品呀,可惜玩 forth 这类语言的人少之又少。
来日还要向楼上的仁兄多多请教啊! ^_*
全都是 IOP(Infrequency Oriented Programming)爱好者啊
factor 写道
都是在消磨这无聊的人生。。。。。。。。。哈哈
国内居然真有人在玩 factor 啊!实在太高兴了。
这东东可是个极品呀,可惜玩 forth 这类语言的人少之又少。
来日还要向楼上的仁兄多多请教啊! ^_*
albertlee 写道
说下理由:
1. 好玩
2. 我不需要靠haskell找工作
3. haskell很简单,也很实用,它很强大,并非玩具。
4. 在haskell的文章中,没有”思想“”道“”模式“一类的词。
1. 好玩
2. 我不需要靠haskell找工作
3. haskell很简单,也很实用,它很强大,并非玩具。
4. 在haskell的文章中,没有”思想“”道“”模式“一类的词。
思想,道,模式不是语言所具备的,是软件开发所必须的。
你写个玩具软件当然不需要模式。
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?
正如有很多人都在研究一些能靠其混口饭吃的语言,不知道是无奈还是无聊。
说下理由:
1. 好玩
2. 我不需要靠haskell找工作
3. haskell很简单,也很实用,它很强大,并非玩具。
4. 在haskell的文章中,没有”思想“”道“”模式“一类的词。
1. 好玩
2. 我不需要靠haskell找工作
3. haskell很简单,也很实用,它很强大,并非玩具。
4. 在haskell的文章中,没有”思想“”道“”模式“一类的词。
- 浏览: 16711 次
- 性别:

- 来自: 珠海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
用haskell 十分钟写一个wi ...
toostupid 写道yanshiyi 写道为什么有很多人都在研究一些无法靠其 ...
-- by albertlee -
用haskell 十分钟写一个wi ...
LZ, 怎样让你的程序跑起来啊! 具体步骤对NEWBIE很有用。
-- by sw2wolf -
用haskell 十分钟写一个wi ...
toostupid 写道医生头衔? doctor吧? 那是博士吧。 看来不喜欢欣 ...
-- by leon_a -
用haskell 十分钟写一个wi ...
yanshiyi 写道为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要 ...
-- by toostupid -
用haskell 十分钟写一个wi ...
医生头衔? doctor吧? 那是博士吧。
-- by toostupid






评论排行榜