1

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

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

我想在两列中显示这些信息,有什么可能的方法来做到这一点,我能够绑定单值信息并显示在网页上。

4

2 回答 2

6

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

我们在这里有一个抢劫教程。我最近还写了一系列关于这类事情的博客文章。特别是该系列中的第二篇文章可能与您的问题最相关。这是一些代码,可以执行您想要的操作:

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>

这样做的好处是网页设计师可以完全控制名称的显示方式。如果他们需要更改显示以显示“姓氏,名字”格式的无序列表,这在此处很容易做到,而无需重新编译您的应用程序。

于 2011-04-27T05:24:12.397 回答
4

我对blaze-html有强烈的偏好,它是一组出色的组合器,用于将结构化的 Haskell 数据类型快速转换为 html。

它有一个很好的家,有很多例子,比如:

{-# 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

如果你可以text从快照输出,你应该很好。

于 2011-04-27T04:19:56.340 回答