gpt4 book ai didi

class - 为什么 Haskell 说这是模棱两可的?

转载 作者:行者123 更新时间:2023-12-01 06:12:24 26 4
gpt4 key购买 nike

我有一个这样定义的类型类:

class Repo e ne | ne -> e, e -> ne where
eTable :: Table (Relation e)

当我尝试编译它时,我得到了这个:

* Couldn't match type `Database.Selda.Generic.Rel
(GHC.Generics.Rep e0)'
with `Database.Selda.Generic.Rel (GHC.Generics.Rep e)'
Expected type: Table (Relation e)
Actual type: Table (Relation e0)
NB: `Database.Selda.Generic.Rel' is a type function, and may not be injective
The type variable `e0' is ambiguous
* In the ambiguity check for `eTable'
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
When checking the class method:
eTable :: forall e ne. Repo e ne => Table (Relation e)
In the class declaration for `Repo'
|
41 | eTable :: Table (Relation e)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

因为我已经明确声明 e 决定 ne 并且反之亦然,所以我希望一切都明确无误。

但是,如果我只是为了测试目的而尝试这样定义我的类,它会编译:

data Test a = Test a
class Repo e ne | ne -> e, e -> ne where
eTable :: Maybe (Test e)

我不太清楚 Table 是怎么回事和 Relation导致这种情况的类型。

最佳答案

Test 是单射的,因为它是一个类型构造函数。

Relation 不是单射的,因为它是一个类型族。

因此存在歧义。

愚蠢的例子:

type instance Relation Bool = ()
type instance Relation String = ()

instance Repo Bool Ne where
eTable :: Table ()
eTable = someEtable1

instance Repo String Ne where
eTable :: Table ()
eTable = someEtable2

现在,什么是 eTable::Table () ?它可能是来自第一个或第二个实例的那个。这是不明确的,因为 Relation 不是单射的。

关于class - 为什么 Haskell 说这是模棱两可的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876673/

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