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⁺ V
和 Key⁺ 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.Key
和Data.AVL.Height
关于树将包含的 Value
类型。
将 Indexed
放入其自己的核心模块 Data.AVL.Indexed
之后
例如Category.Monad.Indexed
或 Data.Container.Indexed
赋予map
一个多态类型:现在可以改变
在树上映射时包含在树中的值。
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⁺ V
和 Key⁺ 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.Key
和Data.AVL.Height
关于树将包含的Value
类型。将
Indexed
放入其自己的核心模块Data.AVL.Indexed
之后 例如Category.Monad.Indexed
或Data.Container.Indexed
赋予
map
一个多态类型:现在可以改变 在树上映射时包含在树中的值。