在搜索了类似但不完全相同的错误之后,我在调试此问题时失去了下一步的步骤。
的相关行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
环境详情:
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
答案 0 :(得分:2)
查看您尝试撰写的两个功能的类型:
readHtml
:: ReaderOptions Reader options -> String -> Either PandocError Pandoc
readHtml
是一个失败的操作。为了表示这一点,它返回 PandocError或有效的Pandoc。
writePlain
:: WriterOptions -> Pandoc -> String
writePlain
只需要一个有效的Pandoc。
程序必须处理这两种情况:
readHtml
返回左/错误值readHtml
返回正确/有效值这可以通过各种方式完成,但例如:
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 b
与Maybe a
类似,如果您熟悉它,除非在失败的情况下可以提供额外信息。按照惯例,Left
构造函数用于表示错误值,Right
构造函数用于表示正常值。