Parsec3被parsec阻止了,我做了什么

时间:2016-06-01 19:09:08

标签: haskell text package-managers parsec

使用看起来像这样的cabal文件(相关的库部分):

  

build-depends:base> = 4.8&& < 4.9,filepath> = 1.4&& < 1.5,时间> = 1.5&& < 1.6,bytestring> = 0.10&& < 0.11,unix> = 2.7&& < 2.8,cryptohash> = 0.11&& < 0.12,process> = 1.2&& < 1.3,变压器> = 0.4&& < 0.5,文本> = 1.2&& < = 1.3,base16-bytestring> = 0.1.1&& < 1.1.2,utf8-string> = 1&& < 1.1,目录> = 1.2&& < 1.3,regex-base> = 0.9&& < 1.0,regex-pcre> = 0.94&& < 0.95,正则表达式> = 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

我要做的是使用floating2包中的parsec3-numbers解析器,但不知怎的,我也得到了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的Text解析功能,这就是我参与其中的原因。

的Fredrik

编辑:

好的,将这个问题缩小到最小的形式,突出了真正的问题。 使用此代码:

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仍被引入,并且正在“阻止”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)

2 个答案:

答案 0 :(得分:1)

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

我认为你的软件包数据库已经搞砸了。我会尝试使用cabal沙箱和/或使用var result = Retrieve(a => a.SomeDateProperty.Date >= startDate && a.SomeDateProperty.Date <= endDate);

如果您使用stack,只需将其添加到stack文件的extra-deps:部分:

stack.yaml

答案 1 :(得分:1)

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

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