我正在使用snap框架和haskell来创建简单的Web应用程序。我想知道如何将列表呈现到网页,就像这样我有一个名字和姓氏的列表
[["firstName1","lastName1"],["firstName2","lastName2"],["firstName3","lastName3"]]
我想在两列中显示这些信息,有哪些可能的方法,我能够绑定单个值信息并显示在网页上。
答案 0 :(得分:6)
我们有一个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
,那么您应该很好。