Haskell / Parsec - 注释掉parseFromFile调用会导致模糊类型

时间:2015-12-08 20:45:13

标签: haskell types parsec hindley-milner

我正在处理一些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调用将使其编译,但我不想为此目的调用它。我可以输入所有组合码的注释,但这很麻烦。

1 个答案:

答案 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