Я в Haskell начинающий. Много раз перечитывал
http://happstack.com/docs/crashcourse/index.html . Примеры, где HTML генерится через
hsx QuasiQuoter и, в скобках
<% getMethod %>, т.е. можно вставлять свою функцию генерирующую текст (но не XML!) – это работает. Но этого недостаточно. Должна быть возможность вставлять заранее неизвестное кол-во повторяющихся элементов, к примеру, таблицу html. Но понять как работать с функциями типа
twoParagraphsWithParent :: (XMLGenerator m, StringType m ~ Text) => XMLGenT m (XMLType m)
и с
defaultTemplate, как их к
Happstack – у собственно, прикрутить, не могу. День убил – на все мои варианты компилятор (7.6.3) ругается.
Почти два дня мучений и вот, пример, как с помощью HSP плодить элементы в цикле. Если кому интересно, то мне не жалко.
{-# LANGUAGE FlexibleContexts, QuasiQuotes, TypeFamilies, OverloadedStrings #-}
module Main where
import Control.Monad.Identity (Identity(..))
import Data.Text.Lazy (Text)
import Language.Haskell.HSX.QQ (hsx)
import HSP
import HSP.Monad
import Happstack.Server.HSP.HTML
import Happstack.Server (ServerPartT,nullConf,simpleHTTP)
toHTML :: HSPT XML Identity XML -> ServerPartT IO XML
toHTML x = return $ runIdentity $ unHSPT x
recursiveFun :: (XMLGenerator m, StringType m ~ Text) =>
Int -> XMLGenT m [ChildType m]
recursiveFun n = do
a <- [hsx|
<%>
<div>
<% fromStringLit $ "recursiveFun " ++(show n) %>
</div>
</%>
|]
if n == 0
then return a
else do
b <- (recursiveFun (n-1))
return $ a ++ b
hello :: ServerPartT IO XML
hello = toHTML $ defaultTemplate "Hello" () $ [hsx|
<p>
<% recursiveFun 2 %>
</p>
|]
main :: IO ()
main = do simpleHTTP nullConf $ hello