You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:54:24