gpt4 book ai didi

haskell - 约束中的这个 'Ambiguous type variable ` a` 是什么意思?

转载 作者:行者123 更新时间:2023-12-03 14:27:35 31 4
gpt4 key购买 nike

在这段代码中,我试图在我的工作函数中使用第一个参数 go成为“类型家族”类型。我在类型 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

Ambiguous type variable `a' in the constraint:

`K a'

arising from an expression type signature at Data/Map2.hs:167:10-33

Probable fix: add a type signature that fixes these type variable(s)

最佳答案

这编译:

{-# 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 的约束。 ,所以我使用了一种强制约束并使其在使用站点可用的类型定义形式,a GADT .

第二,你的 GHC 提示的问题,歧义。关键是编译器无法推断出哪个 mkI它应该使用,所以我们必须告诉它。为此,我们必须将使用的类型变量引入作用域,然后在本地签名中告诉编译器使用哪个类型实例。

关于haskell - 约束中的这个 'Ambiguous type variable ` a` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8827934/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com