好吧,我承认,标题是唬人的。用十分钟实现的这个小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是一种函数式编程语言,它的核心特性包括静态类型、纯函数式编程以及惰性求值。 在尝试编写这个转换函数时,作者遇到了一些错误。...
FPSheet:使用Haskell作为脚本语言的Spreadsheet程序
Monads是Haskell中的一个重要概念,它提供了一种组织和控制副作用的方式。Monads可以看作是具有特定操作规则的值容器,如IO操作、状态管理等。理解Monads对于编写复杂的Haskell程序至关重要。Monads通过do记法使得...
Haskell 函数第一个assignment
Haskell的一个显著优势是它的强静态类型系统,这要求程序员在编译时明确地声明变量及其类型。这有助于提前发现潜在的错误,从而提高了代码的可靠性和维护性。Haskell的模块化设计也意味着它的应用程序是由一系列的...
Haskell 2010语言报告是Haskell编程语言的一个官方文档,详细阐述了Haskell语言的规范。Haskell是一种纯函数式编程语言,它提供了强大的类型系统和高度的抽象化能力。Haskell 2010语言版本是对早期Haskell 98标准的...
另外,curry化(Currying)也是Haskell中的一个重要概念,它允许将多参数函数转化为一系列单参数函数。 5. **6.OverloadingandTypeClasses.ppt - 类型类与重载** Haskell通过类型类实现了一种形式的多态,类似于...
标题中的“用于探索和理解Haskell代码库的Web应用程序”是指一个在线平台,它旨在帮助开发者更有效地理解和分析Haskell编程语言的代码库。这样的工具通常包含一系列功能,如代码搜索、语法高亮、代码片段执行、依赖...
总的来说,`haskell-chart`为Haskell社区提供了一个强大且易用的2D图表库,它不仅能够满足基本的绘图需求,而且具备高度的可扩展性和定制性,适合各种数据可视化应用场景。对于希望在Haskell环境中进行数据可视化的...
这本书以英文撰写,以PDF格式提供,被压缩在一个名为"Haskell Cookbook.zip"的文件中。Haskell是一种纯函数式编程语言,以其强大的类型系统、惰性求值和高级抽象能力而闻名。在这本书中,读者可以深入学习Haskell的...
mmaclone, 在Haskell中,一个简单的Wolfram语言克隆 :一个简单的术语重写系统,带有Wolfram语言的语法 of灵感来自 ,在 48小时内自己写一个方案。 为了更深入地了解 Haskell,我决定编写一个简单的wolframalpha解释...
- 并行计算也是Haskell的一个亮点,利用GHC(Glasgow Haskell Compiler)的并行扩展,可以轻松编写高性能并行程序。 #### 六、Haskell的学习资源 - **参考书籍**: - **《Haskell 98 Language and Libraries》** ...
这个入门章节可能包含了最基础的内容,比如如何在Haskell中编写一个简单的程序来输出"Hello, World!",实现一个计算阶乘的函数以及使用懒惰求值来计算斐波那契数列。除此之外,还可能涵盖了如何声明值以及如何生成...
### Haskell编程语言基础知识点概述 ...以上是对Haskell编程语言基础知识点的一个较为详细的概述。通过学习这些内容,读者将能够更好地理解和掌握Haskell编程的基础知识,并为进一步学习更高级的主题打下坚实的基础。
利用Haskell内部遗传算法库解决旅行商问题,是一个运行遗传算法库的模板
- **类型系统**:Haskell拥有一个强大的静态类型系统,支持类型推断,使得编写代码时可以避免很多运行时错误。 #### 三、Haskell的应用 - **编译器工具**:Glasgow Haskell Compiler (GHC) 和 Hugs 是Haskell语言最...
### 函数式编程语言Haskell的核心概念与特点 Haskell是一种纯函数式编程语言,以其简洁性和强大的抽象能力而...无论是学习函数式编程的基本概念,还是进行高性能计算和并发编程,Haskell都是一个值得深入了解的语言。
9. **编译和调试**:如何使用GHC(Glasgow Haskell Compiler)编译和运行Haskell程序,以及使用GHCi进行交互式编程和调试。 10. **性能优化**:理解惰性求值的影响,学习如何使用`seq`和`deepseq`等工具进行性能...