Haskell中弱对齐类型类Weakalign是否为已知通用抽象?
关于
Weakalign是否为已正式定义通用抽象的提问 我定义了一个与SemiAlign外观高度相似但存在本质差异的类型类:
class ( Functor f ) => Weakalign f where {-# Minimal alignLeft | alignRight #-} alignLeft :: f a -> f b -> f (Either a b) alignLeft = (fmap swap .) . flip alignRight alignRight :: f a -> f b -> f (Either a b) alignRight = (fmap swap .) . flip alignLeft swap :: Either a b -> Either b a swap (Left x) = Right x swap (Right x) = Left x
两个核心方法的行为如下:
alignLeft:对齐两个结构,在键/位置冲突时始终取左侧的值alignRight:对齐逻辑与alignLeft一致,冲突时优先取右侧的值
这两个方法都可以基于Semialign的alignWith或align实现,参考实现如下:
alignLeft :: ( Semialign f ) => f a -> f b -> f (Either a b) alignLeft = alignWith go where go (This x) = Left x go (That y) = Right y go (These x _) = Left x
但反过来,我们无法通过alignLeft或alignRight反向定义出align与alignWith,原因可通过如下合法Weakalign实例佐证:
instance Weakalign ((,) a) where alignLeft = const
感谢Daniel Wagner简化了该示例。
该实例完全符合Weakalign的定义要求,但无法扩展为满足定律约束的Semialign实例。
除了元组的简单示例外,解析器类型场景也能说明这一差异:
data Parser a b = Parser (a -> [(a, b)])
我们可以将该类型的alignLeft实现为回退操作:优先执行第一个解析器,仅当第一个解析器执行失败时才执行第二个解析器。和前述元组实例的原因一致,该解析器类型无法实现满足所有定律的完整SemiAlign实例。
我已查阅semialign包,未找到与该抽象对应的现有类型类,但该抽象具备较高通用性,应当已有相关实现。我想确认它是否存在于其他对齐相关的工具包中,或是该抽象本质上与对齐概念并无关联。无论属于哪种情况,我都希望直接使用现有成熟库提供的能力,而非自行定义新的类型类,因此特此请教:
这个
Weakalign抽象是否是已被正式定义的已知通用抽象?
内容的提问来源于stack exchange,提问作者Wheat Wizard
相关产品推荐
相关产品推荐

