Haskell类型类中如何基于关联类型同义词定义类型别名
报错原因
你遇到的编译错误是因为Haskell要求类的关联类型必须先声明,才能指定默认实现,你当前的代码直接给出了Genome a的默认实现,但没有提前声明它是Reproductive类的关联类型。
实现方案
方案1:定义为顶级类型同义词(无需作为关联类型)
如果你不需要针对不同的Reproductive实例自定义Genome的实现,可以直接把它定义为类外的顶级类型同义词:
{-# LANGUAGE TypeFamilies #-} class Reproductive a where -- | 智能体的基因信息序列 type Strand a -- | 生物体的全套(两条链)遗传信息 type Genome a = (Strand a, Strand a)
这种写法下,所有满足Reproductive a约束的类型都可以直接使用Genome a,无需在实例中做额外实现。
方案2:保留为关联类型(支持自定义实现)
如果你需要把Genome作为Reproductive类的关联类型,允许部分实例自定义其实现,只需要先在类中声明关联类型,再给出默认实现即可:
{-# LANGUAGE TypeFamilies #-} class Reproductive a where -- | 智能体的基因信息序列 type Strand a -- | 生物体的全套(两条链)遗传信息 type Genome a -- 先声明关联类型 type Genome a = (Strand a, Strand a) -- 给出默认实现
这种写法下,实现Reproductive实例时如果不手动指定Genome的实现,会默认使用(Strand a, Strand a),有特殊需求时也可以单独为实例改写Genome的定义。
内容的提问来源于stack exchange,提问作者mhwombat
相关产品推荐
相关产品推荐

