【问题标题】:Haskell / Parsec - commenting out parseFromFile call leads to ambiguous typesHaskell / Parsec - 注释掉 parseFromFile 调用会导致类型不明确
【发布时间】:2015-12-08 20:45:13
【问题描述】:

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

【问题讨论】:

    标签: haskell types parsec hindley-milner


    【解决方案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
    

    【讨论】:

    • 您必须将a 替换为适当的原因类型(或在使用PartialTypeSigs 时使用_)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多