我正在完成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
答案 0 :(得分:3)
“renderHtml”的结果未包含在monad中,因此您无需使用&gt;&gt; =
只需打印出结果:
main = putStrLn $ show $ renderHtml notes
结果是:
"<!DOCTYPE HTML>\n<html><head><title>John' 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