Parsec3 被 parsec 阻塞,我怎么办

Parsec3 blocked by parsec, what ever I do

使用如下所示的 cabal 文件(相关库部分):

build-depends: base >=4.8 && < 4.9, filepath >=1.4 && <1.5, time >=1.5 && <1.6, bytestring >=0.10 && <0.11, unix >=2.7 && <2.8, cryptohash >=0.11 && <0.12, process >=1.2 && <1.3, transformers >= 0.4 && < 0.5, text >= 1.2 && <= 1.3, base16-bytestring >= 0.1.1 && < 1.1.2, utf8-string >= 1 && < 1.1, directory >=1.2 && <1.3, regex-base >= 0.9 && < 1.0, regex-pcre >= 0.94 && < 0.95, regex-base >= 0.93 && < 0.94, direct-sqlite >=2.3 && <2.4, text >=1.2 && <1.3, filemanip >=0.3 && < 0.4, parsec3-numbers >=0.1 && < 0.2, parsec3 >=1.0 && <1.1

我在做 cabal build 时得到这个:

...
Couldn't match expected type ‘ParsecT
                                Text () Data.Functor.Identity.Identity Double’
            with actual type ‘parsec-3.1.9:Text.Parsec.Prim.ParsecT
                                s0 u0 m0 Double’
NB: ‘ParsecT’
      is defined in ‘Text.Parsec.Prim’ in package ‘parsec3-1.0.1.8’
    ‘parsec-3.1.9:Text.Parsec.Prim.ParsecT’
      is defined in ‘Text.Parsec.Prim’ in package ‘parsec-3.1.9’
In a stmt of a 'do' block: time <- floating

我想做的是使用 parsec3-numbers 包中的 floating2 解析器,但不知何故我也受到了 parsec-3.1.9 的干扰。 如果我将失败的文件加载到 ghci 并设置了 :set -hide-package parsec:set -hide-package parsec-numbers,我会遇到同样的问题。

如何确保我只会获得 parsec3 解析器?我在文件中使用的导入是:

import Text.Parsec.Text
import Text.Parsec
import Text.Parsec.Number
import qualified Data.List as DL
import qualified Data.Text.IO as TIO

import Database.SQLite3
import Data.Text

所以这应该有效。我需要 parsec3 的文本解析功能,这就是我进入这个的原因。

弗雷德里克

编辑:

好的,将此问题简化为突出实际问题的最小形式。 使用此代码:

import Text.Parsec.Text
import Text.Parsec
import Text.Parsec.Number

num:: Bool -> Parser Double
num = floating2

以及不依赖于所用特定构建工具的评估程序

> cd ~ # Move outside of any cabal package
> ghci -hide-package parsec # Parsec should now not be pulled in
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> :l test.hs
[1 of 1] Compiling Main             ( test.hs, interpreted )

test.hs:6:7:
    Couldn't match type ‘parsec-3.1.9:Text.Parsec.Prim.ParsecT
                           s0 u0 m0 Double’
                   with ‘ParsecT
                           Data.Text.Internal.Text () Data.Functor.Identity.Identity Double’
    NB: ‘parsec-3.1.9:Text.Parsec.Prim.ParsecT’
          is defined in ‘Text.Parsec.Prim’ in package ‘parsec-3.1.9’
        ‘ParsecT’
          is defined in ‘Text.Parsec.Prim’ in package ‘parsec3-1.0.1.8’
    Expected type: Parser a -> Parser Double
      Actual type: Bool
                   -> parsec-3.1.9:Text.Parsec.Prim.ParsecT s0 u0 m0 Double
    In the expression: floating2
    In an equation for ‘num’: num = floating2
Failed, modules loaded: none.

如您所见,parsec-3.1.9 仍然被拉入,并且是 'blocking' parsec3 定义。

只是为了在这里提供一个干净的案例,parsec-numbers 是一个包,不是 在这种情况下造成问题:

>  ghci -hide-package parsec-numbers
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
<command line>: cannot satisfy -hide-package parsec-numbers
    (use -v for more information)

FWIW,我能够使用堆栈解析器 lts-5.13 和 lts-6.0 满足您的所有约束。

我认为您的程序包数据库出了问题。我会尝试使用 cabal 沙箱 and/or 使用 stack.

如果您使用 stack,只需将这些添加到 stack.yaml 文件中的 extra-deps: 部分:

extra-deps:
- parsec3-numbers-0.1.0
- parsec3-1.0.1.8

parsec3-numbers 的 .cabal 文件中有:

flag parsec3
    Description: Use parsec3
    Default: False

Library
  exposed-modules:
    Text.Parsec.Number
  if flag(parsec3)
      build-depends: parsec3
  else
      build-depends: parsec

所以我敢打赌你想用 -f parsec3 选项构建 parsec3-numbers