使用Text.XHtml嵌套

时间:2010-02-05 10:21:49

标签: xhtml haskell nested

我有以下代码使用Text.XHtml.Strict库在Haskell中生成一系列带有id和类的div的空白html页面:

module Main where

import Text.XHtml.Strict
import Text.Printf


page :: Html
page = pHeader +++ pTop +++ pBody +++ pFooter

pHeader :: Html
pHeader = header << thetitle << "Page title" 

pTop :: Html
pTop = (dC "header") << (dI "title") 

pFooter :: Html
pFooter = (dC "footer") << (dI "foottext")

pBody :: Html
pBody = body << (dC "main") << (dI "window") << (dI "content")

dC :: String -> Html
dC x = (thediv noHtml)! [theclass x]

dI :: String -> Html
dI x = (thediv noHtml) ! [identifier x]

main :: IO ()
main = do
    printf $ prettyHtml $ page

函数dCdI应分别为class或id。在解释器中,这些函数在连接时工作正常,如:

 printf $ prettyHtmlFragment $ dC "1" +++ dC "2"
<div class="1">
</div>
<div class="2">
</div>

但是当我尝试使用<<代替+++来嵌套它时,我得到一个错误:

<interactive>:1:28:
    Couldn't match expected type `Html -> b'
           against inferred type `Html'

这就是我认为代码主要部分出现问题的原因,但我不知道如何修复它。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

只需取出nohtml部分,然后更改签名:

dC :: String -> Html -> Html
dC x = thediv ! [theclass x]

dI :: String -> Html -> Html
dI x = thediv ! [identifier x]

!运算符不仅可以向Html对象添加属性,还可以向返回Html的函数添加属性。 thediv是一个函数,它接受Html并将其包含在<div>元素中。通过对其应用!,您可以创建一个功能Html并在其周围包裹<div class="…">(或id="…"

> :type thediv
thediv :: Html -> Html

> let dC c = thediv ! [theclass c]
> let dI i = thediv ! [identifier i]

> :type dC
dC :: String -> Html -> Html
> :type dI
dI :: String -> Html -> Html

> putStr $ prettyHtmlFragment $ body << dC "main" << dI "window" << dI "content" << "Hi"
<body>
   <div class="main">
      <div id="window">
         <div id="content">
            Hi
         </div>
      </div>
   </div>
</body>

请注意,您不需要额外的括号。

答案 1 :(得分:1)

dC和cI无法嵌套,因为它们被定义为空。您需要留下嵌套件将进入的孔。通过参数化来表示孔:

dC classx child = (thediv child)! [theclass classx] 
dI x y = (thediv y) ! [identifier x] 

同样适用于身体:

pBody x = body << (dC "main") << (dI "window") << (dI "content" x)