haskell - 不明确的类型变量

标签 haskell generic-programming

相关于my earlier question on traversing data structures ,当我将代码与 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

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

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)

我明白为什么这段代码不明确:transformBi接受(to -> to)from并将其转换为来自;就我而言,Child1 l 中的 lParent l 中的 l 之间没有链接。我不知道如何解决它。我尝试添加类似 transformBi (doInt::Child1 l -> Child1 l) 的类型约束,但出现相同的错误;当我这样做时,就好像我正在引入一个新的l

如何告诉编译器我对 replacetransformBi doInttransformBi doString< 使用相同的 l/

编辑: Here is the full program that demonstrates what I'm doing 。在GHC 6.10.4下,该程序无法编译,出现上述错误。

最佳答案

看来您需要 scoped type variables扩展名。

{-# LANGUAGE ScopedTypeVariables #-}

replace :: forall l. Data l => Parent l -> Parent l
replace = transformBi (doInt :: Child1 l -> Child1 l)
        . transformBi (doString :: Child2 l -> Child2 l)

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

关于haskell - 不明确的类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1865351/

相关文章:

简单快速排序算法的 haskell 解析错误

ios - 使用泛型类型的 Swift 工厂

haskell - 模式同义词导致不详尽的模式匹配

haskell - 如何从 reflex-dom 列表框中获取 DoubleClicked 事件

java - 为什么我通过将 Integer 类型参数设置为泛型中的 Integer 变量而出错?

c++ - 用于控制算法的仿函数的编译时容器?

swift - 如何使泛型类符合特定类型的协议(protocol)?

c - 通用快速排序由于某种原因不起作用

haskell - 如何处理 Applicative 的副作用?

haskell - 将字符串的 UTF-8 编码存储在 ByteString 中