如何从M Pandoc获得Pandoc?

时间:2017-12-04 18:35:23

标签: haskell pandoc

我开始使用pandoc api编写一些程序,从https://johnmacfarlane.net/BayHac2014/#/the-pandoc-types获取示例,但是我无法将Pandoc与m Pandoc隔离开来。

module ImageAttr where
import Text.Pandoc.Builder
import Text.Pandoc.Generic
import Text.Pandoc.Definition
import Text.Pandoc.JSON
import qualified Data.Char as DataChar
import qualified Data.List as DataList
import Data.Either
import Text.Parsec as Parsec
import Text.Pandoc
import qualified Data.Text as T
import qualified Data.Text.IO as TIO

fromRight :: b -> Either a b -> b
fromRight _ (Right b) = b
fromRight b _         = b


fromLeft :: b -> Either b a -> b
fromLeft  _ (Left b)  = b
fromLeft  b _        = b


main :: IO ()
main = do
        result <- runIO $ do
            doc <- readMarkdown def (T.pack "[testing](url)")
            writeRST def doc
        x<-((handleError result))
        print x

输出是字符串,但我需要pandoc ast以前它是PandocError Pandoc类型,而是我得到&#34; m Pandoc&#34;。如何让Pandoc离开Pandoc&#34;。

任何想法? 顺便说一句,我是新人,还在学习哈斯克尔。

我收到错误消息:

ImageSizeModifer.hs:28:12:
    Couldn't match expected type ‘PandocIO a0’ with actual type ‘IO ()’
    In a stmt of a 'do' block: print ""
    In the second argument of ‘($)’, namely
      ‘do { doc <- readMarkdown def (T.pack "[testing](url)");
            print "" }’
Failed, modules loaded: none.
Prelude T>

我的问题是我需要Pandoc,但我不知道如何获得它?有新的PandocIO和PandocPure,我相信这些都是新的。

2 个答案:

答案 0 :(得分:6)

新版pandocreadMarkdown :: PandocMonad m => ReaderOptions -> Text -> m Pandoc。这遵循通常的mtl - 样式来指定monad上的约束,而不是实际的monad。

这意味着要使用readMarkdown,您需要选择满足m的特定PandocMonad。您可以通过滚动到its doc的“实例”部分找到PandocMonad具有的实例。在这种情况下,您会发现:

  • PandocMonad PandocPure也许很有意思
  • PandocMonad PandocIO也许很有意思
  • (MonadTrans t, PandocMonad m, Functor (t m), MonadError PandocError (t m), Monad (t m), Applicative (t m)) => PandocMonad (t m) - 不感兴趣,需要另一个PandocMonad m
  • PandocMonad m => PandocMonad (ParsecT s st m) - 不感兴趣,需要另一个PandocMonad m

现在,滚动浏览定义PandocPurePandocIO的位置,您可以找到运行从中提取信息的方法:

将这些功能中的任何一项与readMarkdown结合使用,即可获得具体的Either类型。

runIO (readMarkdown def (T.pack "[testing](url)")) :: IO (Either PandocError Pandoc)
runPure (readMarkdown def (T.pack "[testing](url)")) :: Either PandocError Pandoc

请注意,我对Pandoc或其API一无所知 - 我所做的就是完成上述过程。

答案 1 :(得分:3)

有关使用pandoc 2.x API的基本教程,请查看http://pandoc.org/using-the-pandoc-api.html