0

マークダウン ファイルを html ファイルに変換し、純粋なシステムで IO を正常に動作させようとするときに、テンプレート ファイルを読み込んでいます。

template :: IO String
template = readFile "/File/Path/template.html"

siteOptions :: WriterOptions
siteOptions = def { writerStandalone = True, writerTemplate = template }

convertMdtoHtml :: FilePath -> IO () 
convertMdtoHtml file = do
  contents <- readFile file 
  let pandoc = readMarkdown def contents
  let html = writeHtmlString siteOptions pandoc
  writeFile (file ++ ".html") html

これは、私が使用しようとしている writeHtmlString のドキュメントですhttp://hackage.haskell.org/packages/archive/pandoc/1.11.1/doc/html/Text-Pandoc-Writers-HTML.html

これを実行しようとすると発生するエラーは

 Couldn't match expected type `String' with actual type `IO String'

Haskellでこれを行う方法はありますか、それともテンプレートファイルを文字列としてコードに含める必要がありますか?

ありがとうございました

4

1 に答える 1

2

パラメータtemplatesiteOptions次のようにします。

siteOptions :: String -> WriterOptions
siteOptions template = def { writerStandalone = True, writerTemplate = template }

convertMdtoHtml :: FilePath -> IO () 
convertMdtoHtml file = do
  ...
  template <- readFile "/File/Path/template.html"
  let html = writeHtmlString (siteOptions template) pandoc

template :: IO StringIO アクションです。これは、実行時に type の結果を生成する、不純な (副作用のある) コードの一部ですStringStringそのため、 aが期待されるコンテキストでは使用できません。

"/File/Path/template.html"コンパイル時にの内容をプログラムに含めたい場合は、Template Haskellの使用を検討してください。

> :set -XTemplateHaskell
> import Language.Haskell.TH.Syntax
> import Language.Haskell.TH.Lib
> let str = $(stringE =<< (runIO (readFile "/path/to/foo")))
> str
"bar\n"
> :t str
str :: [Char]
于 2013-06-12T00:09:09.900 に答える