我有以下代码,使用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
函数
dC
和dI
应该分别使用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'
我认为这是导致代码主体部分出现问题的原因,但我不知道如何解决它。有任何想法吗?
最佳答案
只需取出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>
请注意,您不需要多余的括号。
关于xhtml - 与Text.XHtml嵌套,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2206486/