gpt4 book ai didi

haskell - 双向功能依赖

转载 作者:行者123 更新时间:2023-12-04 03:35:40 24 4
gpt4 key购买 nike

我有一个看起来有点像下面的类型类:

class Foo a b | a -> b where
f :: a -> Bool
g :: b -> Bool
h :: a -> b -> Bool

或者至少这些对我的问题很重要。此类不编译,这是有充分理由的。这个类的问题是我可以(如果我想)做以下事情:
instance Foo () Bool where
f x = True
g y = y
h x y = False

instance Foo ((), ()) Bool where
f x = True
g y = not y
h x y = False

现在,如果我调用 g True每个实例有两个单独的结果。编译器发现了这种可能性,并告诉我我的类型类不好。

我的问题是依赖 | a -> b不是我的意思。我不只是说你可以找到 a来自 b ,但也可以找到 b来自 a .也就是说,每种类型都只能是 Foo 的成员。与另一种类型,所以我们可以给一种类型找到另一种。或者换句话说,依赖是双向的。这样的功能依赖会阻止我拥有 Bool存在于两个单独的实例中,因为第一个参数可以从第二个参数导出,第二个参数可以从第一个参数导出。

但我不知道如何向编译器表达这个想法。

如何创建双向功能依赖?或者,更有可能的是,有没有一种方法可以改写我的类型类以获得可以替换双向函数依赖的东西?

最佳答案

a 之间的双向依赖关系和 b可以表示为两个函数依赖 a -> bb -> a , 喜欢:

class Foo a b | a -> b, b -> a where
f :: a -> Bool
g :: b -> Bool
h :: a -> b -> Bool

所以这里 a功能取决于 bb功能取决于 a .

为您的 instance s 但是这当然会引发错误,因为现在您定义了两个不同的 a代表 b ~ Bool .这将引发如下错误:
file.hs:6:10: error:
Functional dependencies conflict between instance declarations:
instance Foo () Bool -- Defined at file.hs:6:10
instance Foo ((), ()) Bool -- Defined at file.hs:11:10
Failed, modules loaded: none.

由于功能依赖,只能定义一个 a对于 b ~ Bool .但这可能正是您正在寻找的:一种防止定义 Foo 的机制。两次相同 a ,或相同的 b .

关于haskell - 双向功能依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56410544/

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