0

我正在研究一些秒差距代码。在脚本的底部,有一个 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 调用将使它编译,但我不想为了这个目的而必须调用它。我可以键入注释所有组合器代码,但这很乱。

4

1 回答 1

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
于 2015-12-08T21:04:24.230 回答