MFlow是一个用 Haskell 编写的 web 框架,采用 Seaside 的方式,但没有 continuation 的问题(持久性和可扩展性的问题)
Web 开发的主要问题是 HTTP 的无状态特性,它强制使用事件处理编程模型,其中充满了不安全的变量标识符和到处引用的事件处理程序。大多数时候状态是动态类型数据的哈希表形式,因为事件处理程序不共享变量范围。
基于延续的框架,如 ocsigen (ocaml) 和 seaside (smalltalk) 可以很好地处理后退按钮,它们将状态保存在普通变量中,并且可以通过阅读代码来理解导航。而且它们在一定程度上大多是 RESTFul 的。但是这些框架是不可扩展的,并且由于延续的固有问题而存在持久性问题。
Web 应用程序的另一个问题是 HTML 的无类型特性,它会产生不匹配和运行时错误。
在 MFlow 中,不仅每个页面,而且整个导航在编译时都是安全的,并且没有上述问题。它具有基于延续框架的良好特性,但它是可扩展的,因为它使用日志记录和回溯而不是延续。它使用标准的 Haskell 网络库:WAI、formlets、stm、blaze-html。它有一个可插拔的独立组件系统。
这是一个包含三个页面的完整应用程序。在一个循环中,它要求两个数字并显示总和。您可以随意按后退按钮。在配置文件、页面和源代码中,您不必在此处或那里放置任何神奇的标识符:
module Main where
import MFlow.Wai.Blaze.Html.All
main= do
addMessageFlows [("sum", transient . runFlow $ sumIt )]
wait $ run 8081 waiMessageFlow
sumIt= do
setHeader $ html . body
n1 <- ask $ p << "give me the first number" ++> getInt Nothing
n2 <- ask $ p << "give me the second number" ++> getInt Nothing
ask $ p << ("the result is " ++ show (n1 + n2)) ++> wlink () << p << "click here"
只需稍加修改即可使状态保持不变。
http://hackage.haskell.org/package/MFlow
这里有示例和操作方法:http: //haskell-web.blogspot.com.es/