Вложение с Text.XHtml - PullRequest
       18

Вложение с Text.XHtml

3 голосов
/ 05 февраля 2010

У меня есть следующий код для генерации пустой HTML-страницы с серией div с идентификаторами и классами в Haskell с использованием библиотеки Text.XHtml.Strict :

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 должны заполнять класс или идентификатор соответственно. В интерпретаторе эти функции прекрасно работают при объединении, как в:

 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 ]

2 голосов
/ 06 февраля 2010

Просто возьмите 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 голос
/ 05 февраля 2010

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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...