Data.AVL.map更改值类型

时间:2017-11-18 15:30:44

标签: dictionary functor agda

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中的值吗?

2 个答案:

答案 0 :(得分:4)

目前,这似乎并非不可能,至少非常烦人。内部树表示Indexed.TreeKey⁺ Value ...类型的上限和下限参数化,因此必须在Key⁺ VKey⁺ W之间针对不同的值类型进行转换{{ 1}}并说服Agda转换不会改变任何东西。 (当然,这不是因为V, W的定义中没有使用Value,但证明这是一个麻烦。)

解决问题的最简单方法是修复库,将Key⁺参数移到几个范围内。我确信Agda开发者会接受这种效果的补丁。

答案 1 :(得分:2)

我在@ JannisLimperg的回答评论中表达了the refactoring您可以在refactor-avl branch of the standard library中轻松访问它。编辑:它已被合并,现在是stdlib的一部分!

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

Data.AVL

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

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

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