好吧,我承认,标题是唬人的。用十分钟实现的这个小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
分享到:
相关推荐
Haskell 小写转换为大写 引用了Haskell:The craft of Functional Programming
FPSheet:使用Haskell作为脚本语言的Spreadsheet程序
Haskell 函数第一个assignment
mmaclone, 在Haskell中,一个简单的Wolfram语言克隆 :一个简单的术语重写系统,带有Wolfram语言的语法 of灵感来自 ,在 48小时内自己写一个方案。 为了更深入地了解 Haskell,我决定编写一个简单的wolframalpha解释...
利用Haskell内部遗传算法库解决旅行商问题,是一个运行遗传算法库的模板
英文 haskell 的必读书 ...Haskell语言的最重要的两个应用是Glasgow Haskell Compiler (GHC)和Hugs(一个Haskell语言的编译器)。本语言的特式是利用很简单的叙述就可以完成链表、矩阵等数据结构。
用于探索和理解Haskell代码库的Web应用程序
Haskell Function Programming Monads 讲解清楚明了 希望能够让你从此进入 Haskell 的大门
我们上函数编程HASKELL课时候的讲义 很有用的讲解了函数编程 和HASKELL的使用方法 很不错的
haskell语言教材 Haskell(发音为 /ˈhæskə...Haskell语言的最重要的两个应用是Glasgow Haskell Compiler (GHC)和Hugs(一个Haskell语言的编译器)。本语言的特式是利用很简单的叙述就可以完成链表、矩阵等数据结构。
书籍描述: 这种浓缩的代码和语法参考以一种组织良好...你会发现一个简明的、切题的、易于理解的语言参考。haskell快速语法参考包含有用的信息,是任何在大数据、数据科学和云计算领域工作的haskell程序员必须具备的。
Haskell cookbook 2017; Haskell Design Patterns;Haskell High Performance Programming;Haskell Programming From First Principles full; 倾心收集的资料, 祝大家下载愉快;
mysql-haskell:纯haskell mysql驱动程序
haskell-chart, haskell的2D 图表库 图 haskell的2D 图表库进一步的信息可以在关联的 wiki中找到。
这是Haskell编程的上一页,我们正在处理中,将那里的所有书籍都转换为新页面。 请每天检查此页面!!!
haskell实现的经典的猜数字游戏,猜一个四位数字,每猜一次数字返回A*B*表示猜中的数字和位置猜中的数字,本算法保证不超过8次,且不利用任何的筛选机制(意味着内存消耗几乎为0),经本机测试,猜出0123到9876(四...
Haskell语言类型推理的语义模型研究,论文
记录Haskell库选择一个您想要进行文档编制的项目或模块。 我建议使用已经使用的库,但是您也可以在查找内容。 如果您想改用教程,请查看对教程的要求。 如果您希望其他人加入您的行列,请在问题追踪器上发表评论。 ...
Haskell的课程PPT
haskell cookbook, 一本很不错的haskell书籍。 英文,PDF版,已经压缩zip