Pandoc返回任一类型

时间:2017-04-25 00:33:55

标签: haskell pandoc

在搜索了类似但不完全相同的错误之后,我在调试此问题时失去了下一步的步骤。

来自this Haskell script

的相关行
import Text.Pandoc (writePlain, readHtml, def, pandocVersion)

convert :: String -> String
convert = writePlain def . readHtml def

导致此错误:

Main.hs:11:28: error:
    • Couldn't match type ‘Either
                             Text.Pandoc.Error.PandocError Text.Pandoc.Definition.Pandoc’
                     with ‘Text.Pandoc.Definition.Pandoc’
      Expected type: String -> Text.Pandoc.Definition.Pandoc
        Actual type: String
                     -> Either
                          Text.Pandoc.Error.PandocError Text.Pandoc.Definition.Pandoc
    • In the second argument of ‘(.)’, namely ‘readHtml def’
      In the expression: writePlain def . readHtml def
      In an equation for ‘convert’:
          convert = writePlain def . readHtml def

环境详情:

  • GHC 8.0.1
  • Cabal 1.24
  • Arch x64 4.10.9

pandoc已经cabal install'

感谢回答,评论和几个小时的抨击墙,工作解决方案如下:

import Network.HTTP.Conduit (simpleHttp)
import Data.Text.Lazy as TL
import Data.Text.Lazy.Encoding as TLE
import Text.Pandoc
import Text.Pandoc.Error
import Data.Set

htmlToPlainText :: String -> String
htmlToPlainText = writePlain (def {
    writerExtensions = Data.Set.filter (/= Ext_raw_html) (writerExtensions def)
  }) . handleError . readHtml def

main :: IO ()
main = do
    response <- simpleHttp "https://leonstafford.github.io"

    let body = TLE.decodeUtf8 ( response )
    let bodyAsString = TL.unpack ( body )

    putStrLn $ htmlToPlainText bodyAsString

1 个答案:

答案 0 :(得分:2)

查看您尝试撰写的两个功能的类型:

readHtml :: ReaderOptions Reader options -> String -> Either PandocError Pandoc

readHtml是一个失败的操作。为了表示这一点,它返回 PandocError或有效的Pandoc。

writePlain :: WriterOptions -> Pandoc -> String

writePlain只需要一个有效的Pandoc。

程序必须处理这两种情况:

  1. readHtml返回左/错误值
  2. readHtml返回正确/有效值
  3. 这可以通过各种方式完成,但例如:

    import Text.Pandoc (writePlain, readHtml, def, pandocVersion)
    
    convert :: String -> String
    convert = case readHtml def of
      Left err -> show err
      Right doc -> writePlain def doc
    

    Either a bMaybe a类似,如果您熟悉它,除非在失败的情况下可以提供额外信息。按照惯例,Left构造函数用于表示错误值,Right构造函数用于表示正常值。