gpt4 book ai didi

haskell - 如何在 Haskell 中制作具有不同行为的相同类型?

转载 作者:行者123 更新时间:2023-12-04 22:32:11 24 4
gpt4 key购买 nike

我使用 Haskell 和 Functional Graph Library 来表示图形。有两种方法可以比较图形,直接,在函数相等或另一个函数上,我写道,isIsomorph。
我想使用 hash map 来收集图表。为此,我必须为我的图形创建 Eq 类的实例。但是我需要两个哈希图,第一个用于按函数相等比较的图,第二个用于按函数 isIsomorph 比较的图。

如果我做

type Fragment = Gr Atom Bond {-- Gr is a type constructor from the Functional Graph Library}

instance Eq (Gr Atom Bond) where
g == g1 = equal g g1

instance Eq Fragment where
g == g1 = isIsomorph g g1

我有一个预期的错误
Duplicate instance declarations:
instance [overlap ok] Eq (Gr Atom Bond) -- Defined at HLab.hs:45:10
instance [overlap ok] Eq Fragment -- Defined at HLab.hs:48:10

因为类型声明只是换行。

我可以用另一种方式
data Fragment = Fragment {fgraph :: Gr Atom Bond}

instance Eq (Gr Atom Bond) where
g == g1 = equal g g1

instance Eq Fragment where
Fragment g == Fragment g1 = isIsomorph g g1

这是正确的,但我使用了“重”类型的构造函数数据,这种方式也不方便,我必须通过附加函数 fgraph 从片段中获取图形。

是否有任何“美丽”和“真实”的方式在代码的各个部分划分这种类型?

最佳答案

在代码的各个部分中划分这种类型的“美丽”和“真实”方式?是使用 newtype 而不是 data :对于所有类型系统目的,它们是不同的(特别是,您可以定义不同的类型类实例),但它们共享相同的运行时表示,并且没有额外的类似 data :

newtype Fragment = Fragment {fgraph :: Gr Atom Bond}

instance Eq (Gr Atom Bond) where
g == g1 = equal g g1

instance Eq Fragment where
Fragment g == Fragment g1 = isIsomorph g g1

尝试在片段上使用图函数时,您仍然需要在图和片段之间进行转换。

关于haskell - 如何在 Haskell 中制作具有不同行为的相同类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18613870/

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