Haskell 从哪里开始;不能';t将类型MyId与MyId“匹配”;

Haskell 从哪里开始;不能';t将类型MyId与MyId“匹配”;,haskell,ghc,haskell-stack,Haskell,Ghc,Haskell Stack,编辑:非常小的复制可用 堆栈测试在堆栈LTS-8.24(ghc 8.0.2)上运行良好,我尝试更改为LTS-10.5(ghc 8.2.2)。它现在无法进行类型检查,错误消息也没有什么帮助 字面上列出的MyId类型是相同的类型,在my modelmakeId中声明,它位于引用my model的测试帮助包中,并且该代码位于引用这两种类型的测试包中 将函数移动到my model包不会导致任何错误(但我不想这样做,而且即使在同一个包中,我也会遇到其他类型的问题(在测试包中始终是一种用法)) 我已经通读了

编辑:非常小的复制可用

堆栈测试
在堆栈LTS-8.24(ghc 8.0.2)上运行良好,我尝试更改为LTS-10.5(ghc 8.2.2)。它现在无法进行类型检查,错误消息也没有什么帮助

字面上列出的MyId类型是相同的类型,在
my model
makeId
中声明,它位于引用
my model
测试帮助
包中,并且该代码位于引用这两种类型的
测试
包中

将函数移动到my model包不会导致任何错误(但我不想这样做,而且即使在同一个包中,我也会遇到其他类型的问题(在测试包中始终是一种用法)) 我已经通读了8.2的迁移信息,但没有什么突出的。 任何指向正确方向的指针都将不胜感激:)谢谢

编辑:我尝试过删除
.stack work
甚至
~/stack root

包装布局如下所示:

package: my-model
  library
  test-suite test
     deps: my-model, testing-help
package: testing-help
  library
     deps: my-model
没有设置版本要求(因为它是堆栈LTS样式),并且我的包的所有版本都是0.0.0

编辑2:它们都在1
stack.yaml


edit3:抱歉,包deps出错了

,这似乎是Cabal中的一个bug,或者至少是一个缺少的功能。我不知道为什么它适用于较旧的解析程序。stack上提到了这一点。请参阅,在Cabal上。

一个是从
my-model-0.0.0
导入的,另一个是您显然已在本地定义的?当ghc在错误消息中以package+版本作为类型前缀时,通常意味着您依赖同一软件包的两个不同版本。GHC允许这样做,但很容易混淆。尝试重新创建依赖项,使您只依赖于
my model
的一个版本。哦,因为它们都列为
my-model-0.0.0
,我打赌您在不更新版本的情况下更改了包,重新编译了包,并且没有重新编译依赖它的所有内容。这是一个危险的工作流程。(ghc在内部通过包id散列来区分包,因此它可以区分包。它只显示版本号,所以你无法区分它们。这是个问题。)我添加了一些关于包版本的详细信息。我怀疑这是因为10.5将Cabal更改为版本2,这导致更多的模块被构建为测试套件的一部分,然后与库版本冲突。在任何Cabal迁移指南中都看不到,虽然我认为使用8.2.1会使堆栈使用Cabal 2.0,但使用8.0.2时使用Cabal 1.24,而这只发生在2.0版的阴谋集团中?我提到的问题似乎也影响到2.0版之前的阴谋集团。我的意思是上面的1.26版:这个评论也提到它是允许的,因为1.26版看起来像是用来解决缺少的阴谋集团特性的堆栈,但由于某种原因现在不允许。最终将测试转移到另一个包,因此没有包级别的循环
package: my-model
  library
  test-suite test
     deps: my-model, testing-help
package: testing-help
  library
     deps: my-model