如何在Haskell中使具有不同行为的相同类型?

谢尔盖·索斯宁(Sergey Sosnin)

我使用Haskell和功能图库来表示图。有两种方法可以直接比较图形,即通过函数equal或通过另一个函数isIsomorph进行比较我想使用哈希图来收集图形。为此,我必须为我的图创建类Eq的实例但是我需要两个哈希图,第一个用于按函数equal比较的图,第二个用于按函数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从片段中获取图形。

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

约阿希姆·布雷特纳(Joachim Breitner)

将这种类型划分为代码各部分的“美丽”和“真实”方式?是用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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Jasperreports中使用JRBeanCollectionDatasource创建相同类型但具有不同数据系列的多个图表

Python 类型提示以匹配具有共同行为的不同类

如何在Hibernate Criteria API中使用row_number(或具有相同行为的任何东西)?

如何在具有不同类型值的映射中使用泛型

Scala:具有相同类的对象具有不同的类型?

如何在 SQL Server 中比较具有相同 ID 的不同行中的相同值

如何在zsh中使星号'*'具有与bash相同的行为?

自身进行变量迭代-不同类型的不同行为

如何保证Set.removeAll具有不同类型的集合的行为?

Git core.safecrlf对具有相同行尾的文件的不同行为

具有相同类型但名称不同的多个元素?

从类到具有不同模板类型的相同类的转换

TypeScript:具有相同形状的对象的不同类型

如何在Haskell中使用不同类型monad的值

Java Bean验证:如何指定相同类型但具有不同组的多个验证约束?

与GridView具有相同行为的布局?

如何在Python中为具有不同类型的字典添加类型声明作为值

如何在两个具有不同输出类型的相同Haskell函数中删除代码重复?

如何在具有相同类名的div中动态设置不同的<a href>和<img src>?

如何在具有相同类名的不同 div 上运行 javascript 计时器

如何在Golang中缩短具有相同类型属性的结构声明?

如何在Haskell中合并不同类型的地图?

如何在不同的头文件中具有相同类型和名称的两个结构而不会发生冲突?

如何在类型化数据集xsd中使用具有相同表结构的不同数据库

如何报废具有相同模式的不同类名

go的地图哈希函数如何工作,以便具有“相同”值的不同类型导致不同的键?

如何在Typescript中正确定义具有不同类型的值的对象

如何在C ++中处理具有多个不同类型的数据成员的类?

如何映射具有相同类型列表的属性