我正在处理一些parsec代码。在脚本的底部,有一个parseFromFile调用,其中ParseFromFile来自Text.Parsec.String
parseFromFile parserCode inFile
如果我对此进行评论,我的代码将不再编译,并且会出现一些模糊的类型错误:
DeleteMe.hs:47:18-23: No instance for (Stream s0 Data.Functor.Identity.Identity Char) …
arising from a use of ‘noneOf’
The type variable ‘s0’ is ambiguous
Relevant bindings include
parseSeq :: ParsecT s0 u Data.Functor.Identity.Identity [Char]...
在严格和懒惰形式的流之间存在歧义:
Note: there are several potential instances:
instance Monad m =>
Stream Data.ByteString.Internal.ByteString m Char
-- Defined in ‘Text.Parsec.Prim’
instance Monad m =>
Stream Data.ByteString.Lazy.Internal.ByteString m Char
-- Defined in ‘Text.Parsec.Prim’
instance Monad m => Stream Text m Char
-- Defined in ‘Text.Parsec.Prim’
parseFromFile必须消除类型推断的歧义。解决这种歧义的正确方法是什么?包括parseFromFile调用将使其编译,但我不想为此目的调用它。我可以输入所有组合码的注释,但这很麻烦。
答案 0 :(得分:1)
parseFromFile
的类型为
parseFromFile :: Text.Parsec.String.Parser a -> String -> IO (Either Text.Parsec.Error.ParseError a)
因此,向parserCode
添加类型注释应该可以解决问题:
parserCode :: Text.Parsec.String.Parser a
这不像现在这样普遍(我们可能也希望使用Text.Parsec.ByteString.parseFromFile
)。
对于这种情况,我们可以使用像
parserCode :: Stream s Identity Char => Parsec s () a