`
albertlee
  • 浏览: 35667 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

用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 里面找,找不到的话,给一个创建页面,找到了的话,就现实这个页面。

  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
分享到:
评论
24 楼 albertlee 2008-10-06  
toostupid 写道
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?


以前我老师在15分钟就用haskell完成了一个编译器。

这个编译器帮我们把用haskell写的游戏逻辑直接编译成游戏语言。
是一个完整的编译器。
在研究的领域haskell是很强大的工具。


是用的 parsec 库写的吧。
23 楼 sw2wolf 2008-09-28  
LZ, 怎样让你的程序跑起来啊!
具体步骤对NEWBIE很有用。
22 楼 leon_a 2008-09-12  
toostupid 写道
医生头衔? doctor吧? 那是博士吧。

看来不喜欢欣赏懂幽默....
21 楼 toostupid 2008-09-10  
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?


以前我老师在15分钟就用haskell完成了一个编译器。

这个编译器帮我们把用haskell写的游戏逻辑直接编译成游戏语言。
是一个完整的编译器。
在研究的领域haskell是很强大的工具。
20 楼 toostupid 2008-09-10  
医生头衔? doctor吧? 那是博士吧。
19 楼 yushih 2008-08-23  
lichray 写道
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?


正如有很多人都在研究一些能靠其混口饭吃的语言,不知道是无奈还是无聊。



哈 哈哈 哈哈哈 哈哈哈哈
18 楼 stevendu 2008-06-23  
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?

java貌似是最好混饭吃的语言。
17 楼 indra 2008-06-17  
albertlee 写道
可惜折腾了一晚上连它的安装包都没下载下来……

你是说 forth 还是 factor ?
factor 的话去 http://www.factorcode.org/getfactor.fhtml ,根据自己的系统下载、解压就行,不用安装。
16 楼 seen 2008-06-17  
forth?第一次听说这名字是在汉语言编程里骂战里。。。
15 楼 albertlee 2008-06-17  
可惜折腾了一晚上连它的安装包都没下载下来……
14 楼 indra 2008-06-17  
是啊,我也是无意中认识了 forth 后,就被她深深的吸引,她的逆波兰表达式(与 lisp 的剑桥波兰表达式相映成趣,一个是“前”,一个是“后”。)、任意字符编程(真的是任意字符,只要你能敲出火星文字,你就可以用外星文字编程,用乱码也是可以的,不过要小心,这样的源代码可真的就是天书了。 ^_^)、极强的可扩展性(跨平台移植只要实现约 70-130 个“原语”,嵌入式系统可能只有 20 个不到。),还有基于堆栈的虚拟机,等等这些特性真的让人“疯狂”,夸张点说,这是一个“人机合一”的语言,因为用她编程,你要把你的脑子变成两个“堆栈”,呵呵!

就我自己来说,我认为真正有意思的编程语言只有两个(及她们的衍生物): lisp 与 forth,这两个语言非常古老,但都拥有对自身编程的能力,所以可以方便的添加本身所没有的现代编程特性,像 forth 给自己添加基本的面向对象支持,也就是几十行代码就差不多了。

不过自己实现总是麻烦,现在好了,有了 factor: 一个 lisp 与 forth 的综合体,还添加了许多现代的特性:对象、延续、erlang 样式的并发等等,还有她调用外部程序和部署应用的能力,比 haskell 和 erlang 可好得太多,当然这只是我个人的看法。

不知不觉把这帖子写得有点像广告了,见谅啊! :-)
13 楼 albertlee 2008-06-16  
我小时候喜欢收集旧书摊上的科普类杂志,每本三四毛钱,记得涛到一本很古老的电子技术类的杂志,里面在连载一个计算机程序的讲座,就是讲 forth。
12 楼 albertlee 2008-06-16  
indra 写道
factor 写道
都是在消磨这无聊的人生。。。。。。。。。哈哈

国内居然真有人在玩 factor 啊!实在太高兴了。
这东东可是个极品呀,可惜玩 forth 这类语言的人少之又少。
来日还要向楼上的仁兄多多请教啊! ^_*


全都是 IOP(Infrequency Oriented Programming)爱好者啊
11 楼 indra 2008-06-16  
factor 写道
都是在消磨这无聊的人生。。。。。。。。。哈哈

国内居然真有人在玩 factor 啊!实在太高兴了。
这东东可是个极品呀,可惜玩 forth 这类语言的人少之又少。
来日还要向楼上的仁兄多多请教啊! ^_*
10 楼 sutra 2008-06-08  
albertlee 写道
说下理由:

1. 好玩
2. 我不需要靠haskell找工作
3. haskell很简单,也很实用,它很强大,并非玩具。
4. 在haskell的文章中,没有”思想“”道“”模式“一类的词。

思想,道,模式不是语言所具备的,是软件开发所必须的。
你写个玩具软件当然不需要模式。
9 楼 factor 2008-06-02  
都是在消磨这无聊的人生。。。。。。。。。哈哈
8 楼 lichray 2008-06-02  
yanshiyi 写道
为什么有很多人都在研究一些无法靠其找到工作的语言?工作需要还是兴趣?


正如有很多人都在研究一些能靠其混口饭吃的语言,不知道是无奈还是无聊。
7 楼 xqstation 2008-06-02  
自从认识了Rails之后已经不再相信什么十几分钟写一个XX程序的东西了。。
6 楼 albertlee 2008-05-29  
说下理由:

1. 好玩
2. 我不需要靠haskell找工作
3. haskell很简单,也很实用,它很强大,并非玩具。
4. 在haskell的文章中,没有”思想“”道“”模式“一类的词。
5 楼 neora 2008-05-27  
好文阿。成了我的haskell入门第一篇了。

相关推荐

Global site tag (gtag.js) - Google Analytics