2

私は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
4

1 に答える 1

3

"renderHtml" の結果はモナドにラップされないため、 >>= を使用する必要はありません

結果を印刷するだけです:

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 notes の出力は 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
于 2014-11-04T00:59:23.090 に答える