0

我在将 markdown 文件转换为 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

template一个参数siteOptions

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 String是一个IO 操作- 一段不纯的(副作用)代码,在执行时将产生类型的结果String。这就是为什么您不能在String预期 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 回答