【问题标题】:Parsec3 blocked by parsec, what ever I doParsec3 被 parsec 阻止,我做了什么
【发布时间】:2016-06-01 19:09:07
【问题描述】:

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

build-depends: base >=4.8 && =1.4 && =1.5 && =0.10 && =2.7 && = 0.11 && =1.2 && = 0.4 && = 1.2 && = 0.1.1 && = 1 && =1.2 && = 0.9 && = 0.94 && = 0.93 && =2.3 && =1.2 && =0.3 && parsec3-numbers >=0.1 && =1.0 &&

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

【问题讨论】:

  • 生成一个最小的工作示例是标准做法(这里“工作”的意思是“产生你引用的错误”)。对于 cabal 问题,理想情况下至少包括一个最小化的.cabal 文件和一个最小化的.hs 文件。您已经暗示了每个内容的一些内容,但没有足够的细节来重现您的问题。
  • 顺便说一句 - floating2 的签名应该是 Bool -&gt; Parser Double
  • 是的,你是对的。我现在修好了。

标签: haskell text package-managers parsec


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

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

【讨论】:

  • 太棒了!是的,虽然我试图阻止它,但 parsec3 会引入 parsec。重新编译解决了一切!谢谢!
  • 下次使用-ignore-packageghci -ignore-package parsec Test.hs 导致“无法加载‘Text.Parsec.Number’的接口。”而ghci -ignore-package parsec -package parsec3-numbers Test.hs 导致“无法满足 -package parsec3-numbers: parsec3-numbers-0.1.0-5ewSm5c1kZOI1sNlSx7Ecm 由于缺少或递归依赖项而无法使用:parsec-3.1.11-37j7M1YEHqtEooY7BpJdri”
【解决方案2】:

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

我认为你的包 db 有问题。我会尝试使用阴谋集团沙箱和/或使用stack

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

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

【讨论】:

  • 引用的错误不是关于约束解决,而是关于名称解析。所以“只使用堆栈”的下意识反应显然是不够的。
  • 我仍然会尝试使用 cabal 沙箱和/或堆栈,以确保我们有一个干净的构建并缓解损坏的 pkg db。我在build-depends 中看不到任何直接或间接带来parsec 的东西 - 你呢?
  • parsec3-numbers 依赖于parsec
  • 嗯 - 你去!
  • 这并不能解释任何事情,真的,这一直是我的观点:这个问题没有提供足够的信息让我们来判断哪里出了问题。所以我们应该写 cmets 试图获取这些信息,而不是不能解决问题的即兴答案。
猜你喜欢
  • 2020-11-20
  • 2011-05-08
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多