模糊类型变量

Tim*_*son 3 haskell generic-programming

我之前关于遍历数据结构的问题相关,当我将它与uniplate包一起使用时,我遇到了使代码变得通用的问题.我正在处理Language.Exts.Annotated.Syntax模块中的数据结构,它们都是类型参数的通用l.这l是整个树中的相同.

我写的代码是这样的:

doInt :: Child1 l -> Child1 l
doInt (Child1 l n) = Child1 l (n + 1)

doString :: Child2 l -> Child2 l
doString (Child2 l (_:s)) = Child2 l ('j' : s)

replace :: Data l => Parent l -> Parent l
replace = transformBi doInt
        . transformBi doString
Run Code Online (Sandbox Code Playgroud)

此代码在最后两行产生以下错误:

Ambiguous type variable `l' in the constraint:
  `Data l' arising from a use of `transformBi' at Test.hs:31:10-52
Probable fix: add a type signature that fixes these type variable(s)
Run Code Online (Sandbox Code Playgroud)

我可以看出为什么这段代码含糊不清:transformBi接受a (to -> to)并将from其转换成a from; 在我的情况下,lin Child1 llin 之间没有任何联系Parent l.我没看到的是如何解决它.我尝试过添加类型约束transformBi (doInt :: Child1 l -> Child1 l),但是我得到了相同的错误; 就好像我在l做这个时引入一个新东西一样.

我如何告诉编译器我正在使用相同lreplace,transformBi doInttransformBi doString

编辑: 这是完整的程序,演示我正在做什么.在GHC 6.10.4下,由于上述错误,该程序无法编译.

Ale*_*nov 9

看起来您需要范围类型变量扩展.

{-# LANGUAGE ScopedTypeVariables #-}

replace :: forall l. Data l => Parent l -> Parent l
replace = transformBi (doInt :: Child1 l -> Child1 l)
        . transformBi (doString :: Child2 l -> Child2 l)
Run Code Online (Sandbox Code Playgroud)

请注意,量化必须明确,才能l纳入范围.