`
albertlee
  • 浏览: 36126 次
  • 性别: 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入门第一篇了。

相关推荐

    一个简单的Haskell程序

    这个例子是关于如何编写一个简单的Haskell程序,将小写字母转换为大写字母。Haskell是一种函数式编程语言,它的核心特性包括静态类型、纯函数式编程以及惰性求值。 在尝试编写这个转换函数时,作者遇到了一些错误。...

    cpp-FPSheet使用Haskell作为脚本语言的Spreadsheet程序

    FPSheet:使用Haskell作为脚本语言的Spreadsheet程序

    Haskell 编程入门五星教程

    Monads是Haskell中的一个重要概念,它提供了一种组织和控制副作用的方式。Monads可以看作是具有特定操作规则的值容器,如IO操作、状态管理等。理解Monads对于编写复杂的Haskell程序至关重要。Monads通过do记法使得...

    Haskell 函数第一个assignment

    Haskell 函数第一个assignment

    无涯教程(LearnFk)-Haskell教程离线版.pdf

    Haskell的一个显著优势是它的强静态类型系统,这要求程序员在编译时明确地声明变量及其类型。这有助于提前发现潜在的错误,从而提高了代码的可靠性和维护性。Haskell的模块化设计也意味着它的应用程序是由一系列的...

    Haskell 2010 Language Report

    Haskell 2010语言报告是Haskell编程语言的一个官方文档,详细阐述了Haskell语言的规范。Haskell是一种纯函数式编程语言,它提供了强大的类型系统和高度的抽象化能力。Haskell 2010语言版本是对早期Haskell 98标准的...

    HASKELL函数编程讲义

    另外,curry化(Currying)也是Haskell中的一个重要概念,它允许将多参数函数转化为一系列单参数函数。 5. **6.OverloadingandTypeClasses.ppt - 类型类与重载** Haskell通过类型类实现了一种形式的多态,类似于...

    用于探索和理解Haskell代码库的Web应用程序

    标题中的“用于探索和理解Haskell代码库的Web应用程序”是指一个在线平台,它旨在帮助开发者更有效地理解和分析Haskell编程语言的代码库。这样的工具通常包含一系列功能,如代码搜索、语法高亮、代码片段执行、依赖...

    haskell-chart, haskell的2D 图表库.zip

    总的来说,`haskell-chart`为Haskell社区提供了一个强大且易用的2D图表库,它不仅能够满足基本的绘图需求,而且具备高度的可扩展性和定制性,适合各种数据可视化应用场景。对于希望在Haskell环境中进行数据可视化的...

    Haskell Cookbook.zip

    这本书以英文撰写,以PDF格式提供,被压缩在一个名为"Haskell Cookbook.zip"的文件中。Haskell是一种纯函数式编程语言,以其强大的类型系统、惰性求值和高级抽象能力而闻名。在这本书中,读者可以深入学习Haskell的...

    mmaclone, 在Haskell中,一个简单的Wolfram语言克隆.zip

    mmaclone, 在Haskell中,一个简单的Wolfram语言克隆 :一个简单的术语重写系统,带有Wolfram语言的语法 of灵感来自 ,在 48小时内自己写一个方案。 为了更深入地了解 Haskell,我决定编写一个简单的wolframalpha解释...

    Haskell 文档

    - 并行计算也是Haskell的一个亮点,利用GHC(Glasgow Haskell Compiler)的并行扩展,可以轻松编写高性能并行程序。 #### 六、Haskell的学习资源 - **参考书籍**: - **《Haskell 98 Language and Libraries》** ...

    Haskell Notes For Professionals

    这个入门章节可能包含了最基础的内容,比如如何在Haskell中编写一个简单的程序来输出"Hello, World!",实现一个计算阶乘的函数以及使用懒惰求值来计算斐波那契数列。除此之外,还可能涵盖了如何声明值以及如何生成...

    Haskell_Programming

    ### Haskell编程语言基础知识点概述 ...以上是对Haskell编程语言基础知识点的一个较为详细的概述。通过学习这些内容,读者将能够更好地理解和掌握Haskell编程的基础知识,并为进一步学习更高级的主题打下坚实的基础。

    Tsp问题Haskell GA 算法程序

    利用Haskell内部遗传算法库解决旅行商问题,是一个运行遗传算法库的模板

    learn you a haskell

    - **类型系统**:Haskell拥有一个强大的静态类型系统,支持类型推断,使得编写代码时可以避免很多运行时错误。 #### 三、Haskell的应用 - **编译器工具**:Glasgow Haskell Compiler (GHC) 和 Hugs 是Haskell语言最...

    haskell教材——中文版

    ### 函数式编程语言Haskell的核心概念与特点 Haskell是一种纯函数式编程语言,以其简洁性和强大的抽象能力而...无论是学习函数式编程的基本概念,还是进行高性能计算和并发编程,Haskell都是一个值得深入了解的语言。

    Haskell教程(中文版)

    9. **编译和调试**:如何使用GHC(Glasgow Haskell Compiler)编译和运行Haskell程序,以及使用GHCi进行交互式编程和调试。 10. **性能优化**:理解惰性求值的影响,学习如何使用`seq`和`deepseq`等工具进行性能...

Global site tag (gtag.js) - Google Analytics