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
中的值吗?
答案 0 :(得分:4)
目前,这似乎并非不可能,至少非常烦人。内部树表示Indexed.Tree
由Key⁺ Value ...
类型的上限和下限参数化,因此必须在Key⁺ V
和Key⁺ 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.Key
和Data.AVL.Height
关于树将包含的Value
类型。
将Indexed
放入其自己的核心模块Data.AVL.Indexed
之后
例如Category.Monad.Indexed
或Data.Container.Indexed
赋予map
多态类型:现在可以更改类型
映射时树中包含的值。