我正在使用 snap 框架和 haskell 创建简单的 Web 应用程序。我想知道如何将列表呈现到网页,就像这样我有一个包含名字和姓氏的列表
[["firstName1","lastName1"],["firstName2","lastName2"],["firstName3","lastName3"]]
我想在两列中显示这些信息,有什么可能的方法来做到这一点,我能够绑定单值信息并显示在网页上。
我正在使用 snap 框架和 haskell 创建简单的 Web 应用程序。我想知道如何将列表呈现到网页,就像这样我有一个包含名字和姓氏的列表
[["firstName1","lastName1"],["firstName2","lastName2"],["firstName3","lastName3"]]
我想在两列中显示这些信息,有什么可能的方法来做到这一点,我能够绑定单值信息并显示在网页上。
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>
这样做的好处是网页设计师可以完全控制名称的显示方式。如果他们需要更改显示以显示“姓氏,名字”格式的无序列表,这在此处很容易做到,而无需重新编译您的应用程序。
我对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
从快照输出,你应该很好。