将haskell列表数据渲染到网页

时间:2011-04-27 04:14:05

标签: haskell pretty-print haskell-snap-framework

我正在使用snap框架和haskell来创建简单的Web应用程序。我想知道如何将列表呈现到网页,就像这样我有一个名字和姓氏的列表

[["firstName1","lastName1"],["firstName2","lastName2"],["firstName3","lastName3"]]

我想在两列中显示这些信息,有哪些可能的方法,我能够绑定单个值信息并显示在网页上。

2 个答案:

答案 0 :(得分:6)

Don的建议使用blaze-html是一种方法,但我发现当我这样做时,我更倾向于通过嵌入视图来违反常用的MVC设计模式(在本例中为HTML)进入你的Haskell代码。在某些情况下,如果你只是想做一些快速和肮脏的事情,这可能是要做的事情。但是,如果您希望以一种将视图与控制器分开的方式适应更大的应用程序,并允许设计人员使用不熟悉Haskell的设备,那么您最好使用Heist模板系统。

我们有一个Heist教程here。我最近还写了一系列关于这类事情的blog posts。特别是second post in the series可能与您的问题最相关。这里有一些代码可以像你想要的那样:

names :: [(Text,Text)]
names = [("Alice", "Anderson"), ("Bob", "Brown")]

nameSplice :: (Text, Text) -> Splice Application
nameSplice name =
    runChildrenWithText [("firstName", fst name), ("lastName", snd name)]

namesSplice :: Splice Application
namesSplice = mapSplices nameSplice names

将应用程序中的名称拼接与bindSplice "names" namesSplice绑定后,您可以从以下模板中获取此数据:

<table>
<names>
  <tr><td><firstName/></td><td><lastName/></td></tr>
</names>
</table>

关于这一点的好处是网页设计师可以完全控制名称的显示方式。如果他们需要将显示更改为以“lastname,firstname”格式说出无序列表,这将非常容易,而无需重新编译您的应用程序。

答案 1 :(得分:4)

我非常喜欢blaze-html,作为一组优秀的组合器,可以快速将结构化Haskell数据类型转换为html。

它有一个很好的home with lots of examples,就像这样:

{-# LANGUAGE OverloadedStrings #-}

import Prelude hiding (head)
import Control.Monad
import Text.Blaze.Html4.Strict
import Text.Blaze.Renderer.Text
import qualified Data.Text.Lazy.IO as T

main = T.writeFile "f" (renderHtml (draw xs))
  where
    xs = [("firstName1","lastName1"),("firstName2","lastName2"),("firstName3","lastName3")]

draw xs = html $ do
    head $ title "Example"
    body $ do
        h1 "Heading"
        table $ forM_ xs $ \(f,l) ->
            tr $ do
                td f
                td f

生成包含此表的text字符串:

Heading

firstName1  firstName1
firstName2  firstName2
firstName3  firstName3

如果您可以从snap输出text,那么您应该很好。