Data.AVL.map 更改值类型

Data.AVL.map that changes value type

Data.AVL module of the standard library 由值类型(除其他事项外)参数化:

module Data.AVL
  {k v ℓ}
  {Key : Set k} (Value : Key → Set v)
  {_<_ : Rel Key ℓ}
  (isStrictTotalOrder : IsStrictTotalOrder _≡_ _<_)

这当然意味着它导出的map函数不能改变值类型:

map : ({k : Key} → Value k → Value k) → Tree → Tree

是否还有办法以非内胚的方式转换存储在 Tree 中的值?

目前,这似乎不是不可能,但至少非常烦人。内部树表示 Indexed.Tree 由类型 Key⁺ Value ... 的上限和下限参数化,因此对于不同的值类型 [=],必须在 Key⁺ VKey⁺ W 之间进行转换14=] 并让 Agda 相信转换不会改变任何东西。 (当然不是,因为 Value 没有用在 Key⁺ 的定义中,但要证明这是一件麻烦事。)

因此,解决该问题的最简单方法是修复库,将 Value 参数向下移动几个范围。我相信 Agda 开发者会接受一个补丁来达到那个效果。

我已执行 the refactoring I was suggesting in the comment to @JannisLimperg's answer. You can readily access it in the refactor-avl branch of the standard library. 编辑:它已被合并,现在是标准库的一部分!

以下是更改日志中列出的更改摘要:

大修 Data.AVL

  • 拆分出不应该依赖的Data.AVL.KeyData.AVL.Height 关于树将包含的 Value 类型。

  • Indexed 放入其自己的核心模块 Data.AVL.Indexed 之后 例如Category.Monad.IndexedData.Container.Indexed

  • 赋予map一个多态类型:现在可以改变 在树上映射时包含在树中的值。