2010-02-05 121 views
3
嵌套

我有以下的代碼來生成與ID和班級在Haskell使用Text.XHtml.Strict庫一系列的div的空白html頁面:問題與Text.XHtml庫哈斯克爾

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應該分別用一個類或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

剛取出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> 

請注意,您不需要額外的括號。

+0

感謝這個,這個庫的文檔很難找到(除了hackage文檔)和教程實際上不存在。 –

+0

查找文檔或示例時,請記住Text.Xhtml包基於Text.Html包,並且具有幾乎完全相同的用法。 – MtnViewMark

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)