首页 文章

这'Ambiguous type variable `a` in the constraint'是什么意思?

提问于
浏览
5

在这段代码中,我试图让我的worker函数 go 中的第一个参数成为'type family'类型 . 我在type families documentation类型中看到类似的 insert 函数属于类型类,而在我的示例中它不属于类型类 .

我是新来的家庭,所以也许我使用它们错了,但这个错误意味着什么?

{-# LANGUAGE TypeFamilies #-}

-- | key
class K a where
  -- | iterator for key
  type I a :: *
  mkI :: a -> I a

--| A map
data (K a) => M a b = M a b

insert :: (K a) => a -> b -> M a b -> M a b
insert = go mkI    -- <<< PROBLEM
  where
    go o a b m = m

约束中的模糊类型变量a':K a'

由Data / Map2.hs中的表达式类型签名引起:167:10-33
可能的修复:添加修复这些类型变量的类型签名

1 回答

  • 10

    这编译:

    {-# LANGUAGE TypeFamilies, GADTs, ScopedTypeVariables #-}
    
    -- | key
    class K a where
      -- | iterator for key
      type I a :: *
      mkI :: a -> I a
    
    -- | A map
    data M x y where
        M :: K a => a -> b -> M a b
    
    insert :: forall a b. (K a) => a -> b -> M a b -> M a b
    insert = go mkI
      where
        go :: (a -> I a) -> a -> b -> M a b -> M a b
        go o a b m = m
    

    我改变了什么,为什么?

    首先,我假设你想要 M 上的约束,所以我使用了一种类型定义形式来强制执行约束并使其在使用站点上可用, GADT .

    第二,GHC抱怨的问题,含糊不清 . 关键是编译器无法推断它应该使用哪个 mkI ,所以我们必须告诉它 . 为此,我们必须将使用的类型变量带入范围,然后告诉编译器在本地签名中使用哪种类型实例 .

相关问题