Generics 编译/修复monadiccp类型错误
如果有人能通过编译monadiccp来帮助我研究这个问题,我将不胜感激。有一个打字问题我不明白 复制步骤Generics 编译/修复monadiccp类型错误,generics,haskell,types,typeerror,Generics,Haskell,Types,Typeerror,如果有人能通过编译monadiccp来帮助我研究这个问题,我将不胜感激。有一个打字问题我不明白 复制步骤 安装合理的ghc最新版本;我有7.0.3 cabal安装Monatron cabal解包monadiccp ghci控制/CP/ComposableTransformers.hs 我得到这个错误 Control/CP/ComposableTransformers.hs:246:31: Couldn't match expected type `Tree solver0 a1 -&
- 安装合理的ghc最新版本;我有7.0.3
cabal安装Monatron
cabal解包monadiccp
ghci控制/CP/ComposableTransformers.hs
Control/CP/ComposableTransformers.hs:246:31:
Couldn't match expected type `Tree solver0 a1 -> Tree solver0 a1'
with actual type `forall a2. Tree solver a2 -> Tree solver a2'
Expected type: Tree solver0 a1 -> Tree solver0 a1
Actual type: Bound solver
In the second argument of `BBP', namely `bound''
In the second argument of `($)', namely `BBP (v + 1) bound''
Failed, modules loaded: Control.CP.Transformers, Control.CP.SearchTree, Control.CP.Solver, Control.CP.Queue, Control.CP.Debug, Control.CP.PriorityQueue, Control.Mixin.Mixin.
这是一个奇怪的观察。如果有人改变了这条线
continue $ BBP (v + 1) bound'
以错误中给定的类型为特征
continue $ BBP (v + 1) (undefined :: Tree solver0 a1 -> Tree solver0 a1)
然后它就工作了,但是如果引入一个伪变量
let x = (undefined :: Tree solver0 a1 -> Tree solver0 a1)
continue $ BBP (v + 1) x
类型错误变得更加难以理解(我可能需要正式学习类型)
如果您能了解情况(包括解决问题),我们将不胜感激。我不久前给开发人员发了一封电子邮件,但他没有回复。我不是100%确定发生了什么,只是简单地手动重写do块就可以为我编译了:
returnCT (CBBST newBound) (BBP v bound) continue exit =
newBound >>= continue . BBP (v + 1)
我可以通过稍微丑化一些类型定义来编译
ComposableTransformers.hs
,如下所示:
newtype CBranchBoundST solver a = CBBST (NewBound solver a)
data BBEvalState solver a = BBP Int (Bound solver a)
type Bound solver a = Tree solver a -> Tree solver a
type NewBound solver a = solver (Bound solver a)
instance (Solver solver) => CTransformer (CBranchBoundST solver a)
where
type CEvalState (CBranchBoundST solver a) = BBEvalState solver a
基本上,我只是将一个类型变量a
穿过这些定义。我确信修改后的代码与原始代码的意图是一致的
不幸的是,正如最初的问题提问者所说,出现了许多其他编译错误。太好了,非常感谢!看起来还有很多错误。。。这是一个非常奇怪的问题。
newtype CBranchBoundST solver a = CBBST (NewBound solver a)
data BBEvalState solver a = BBP Int (Bound solver a)
type Bound solver a = Tree solver a -> Tree solver a
type NewBound solver a = solver (Bound solver a)
instance (Solver solver) => CTransformer (CBranchBoundST solver a)
where
type CEvalState (CBranchBoundST solver a) = BBEvalState solver a