感谢mightybyte在irc上帮助我解决这个问题。在我被禁止回答自己的 8 小时之后,这是我的相同答案的变体:
构建一个读取模板 qu1.tpl 的拼接,将其实例化(即,在列表中填写问题的名称和编号),然后返回它。抢劫功能 callTemplate 可以帮助您。(这个拼接在下面的伪代码中称为 splicex。)
编写另一个折叠 splicex 的拼接,以便获得(实例化的)问题列表而不是单个问题。(伪代码中的函数拼接。)
使用 bindSplice 而不是 bindString。
伪代码(测试然后修改并脱离上下文) -
... -> let
splice :: Monad m => Splice m
splice = foldM (\ ts (s, i) ->
liftM ((++) ts) $ splicex (quName, quNumber))
[]
(zip questionName [0..])
splicex :: Monad m => (String, Int) -> Splice m
splicex (quName, quNumber) =
do
mt <- callTemplate "qu1"
[ ("question-name", Data.Text.pack quName)
, ("question-number", Data.Text.pack $ show quNumber)
]
case mt of
Nothing -> error "splice rendering failed."
Just (t :: Template) -> return t
in
-- fill in the list of (instatiated) questions
heistLocal (bindSplice "qulist" splice) $
-- before that, instantiate the overall page
instantiatePage $
render "qu"
顺便说一句,我的 sourceforge 头像太弱,无法创建新标签。有人愿意用“抢劫”来标记这个吗?
链接:
http://snapframework.com/
freenode IRC 网络上的#snapframework 频道。
http://snapframework.com/docs/tutorials/heist