如何从火焰中获取html - 打印到文件

时间:2014-11-03 23:23:05

标签: haskell blaze-html

我正在完成blaze-html教程。我只想要一个简单的Hello World页面。

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad (forM_)
import Text.Blaze.Html5
import Text.Blaze.Html5.Attributes
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A

import Text.Blaze.Html.Renderer.Text

notes :: Html

notes = docTypeHtml $ do
    H.head $ do
        H.title "John´ s Page"
    body $ do
        p "Hello World!"

它在哪里?我如何获取我的HTML?我可以将它打印到终端或文件吗?那将是一个很好的开始。

<html>
<head><title>John's Page</title></head>
<body><p>Hello World!</p></body>
</html>

所有的进口声明真的有必要吗?我只是想让它发挥作用。


我尝试使用renderHTML函数进行打印,但我收到一条错误消息:

main = (renderHtml notes) >>=   putStrLn 
notes.hs:21:9:
    Couldn't match expected type `IO String'
                with actual type `Data.Text.Internal.Lazy.Text'
    In the return type of a call of `renderHtml'
    In the first argument of `(>>=)', namely `(renderHtml notes)'
    In the expression: (renderHtml notes) >>= putStrLn

1 个答案:

答案 0 :(得分:3)

“renderHtml”的结果未包含在monad中,因此您无需使用&gt;&gt; =

只需打印出结果:

main = putStrLn $ show $ renderHtml notes

结果是:

   "<!DOCTYPE HTML>\n<html><head><title>John&#39; s
   Page</title></head><body><p>Hello World!</p></body></html>"

一般来说,像这样的错误开始的地方是将文件加载到GHCI中并查看类型是什么。以下是我将用于此问题的会话:

*Main> :t notes
notes :: Html
*Main> :t renderHtml notes
renderHtml notes :: Data.Text.Internal.Lazy.Text

您可以看到renderHtml笔记的输出只是Text的一个实例。 Text有一个Show实例,所以我们可以调用“putStrLn $ show $ renderHtml notes”来获得所需的输出。

但是,使用Text时,通常最好使用Data.Text。[Lazy。] IO包来执行IO。请注意“TIO”的导入和下面代码中的最后一行:

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad (forM_)
import Text.Blaze.Html5
import Text.Blaze.Html5.Attributes
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A

import Text.Blaze.Html.Renderer.Text
import qualified Data.Text.Lazy.IO as TIO

notes :: Html

notes = docTypeHtml $ do
    H.head $ do
        H.title "John' s Page"
    body $ do
        p "Hello World!"

--main = putStrLn $ show $ renderHtml notes
main = TIO.putStr $ renderHtml notes