Parsing 具有歧义类型的parsec错误
我正在使用haskell编写wiki解析器,我遇到了这个wierd问题。我现在的代码如下所示Parsing 具有歧义类型的parsec错误,parsing,haskell,parsec,Parsing,Haskell,Parsec,我正在使用haskell编写wiki解析器,我遇到了这个wierd问题。我现在的代码如下所示 import System.Environment import Control.Applicative hiding ((<|>), many) import Control.Monad import Text.Parsec import Text.Parsec.String import Text.Parsec.ByteString.Lazy data RichText = UTex
import System.Environment
import Control.Applicative hiding ((<|>), many)
import Control.Monad
import Text.Parsec
import Text.Parsec.String
import Text.Parsec.ByteString.Lazy
data RichText = UText String
| DText String
deriving (Show)
parseBold = do
string "\'\'\'"
manyTill anyChar (try (string "\'\'\'"))
parseItalic = do
string "\'\'"
manyTill anyChar (try (string "\'\'"))
parsefunc content = do
case (parse parseItalic "parsing" content) of
Right result -> return result
Left error -> return "some error!"
main = do
content:_ <- getArgs
result <- parsefunc content
print result
我无法理解这个错误是什么。显然,我的类型是一个字符串(只不过是[Char]),但为什么编译器会抱怨它是Char?有一个歧义错误 解析器的类型可以是
Text.Parsec.String.Parser
或Text.Parsec.ByteString.Lazy.Parser
,编译器不知道选择哪个
如果添加类型,则可以获得要编译的代码
parseBold::Text.Parsec.ByteString.Lazy.Parser String
parseBold = do
....etc
还有其他方法可以解决这种歧义
您可以在推断类型的其他地方使用
parseBold
/parseItalic
,或者您可以清理导入,以便只允许一种情况。您已经导入了这两种情况
import Text.Parsec.String
import Text.Parsec.ByteString.Lazy
前者解析“Stream Char”,后者解析“Stream Word8”。因此,您必须通过testring.Lazy去掉,只留下一个变体。如果两者都需要(例如,您打算使用多态函数解析ByteString和String),则必须显式地对流进行参数化
import Text.Parsec.String
import Text.Parsec.ByteString.Lazy