我在弄清楚如何在Agda中使用String键正确制作Map时遇到了一些麻烦。我有以下内容:
import Data.AVL.IndexedMap
Var = String
data Type where -- ...
alwaysType : Var -> Set
alwaysType _ = Type
open Data.AVL.IndexedMap alwaysType (StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder)
这给出了错误:
String != Σ String _Key_90 of type Set
when checking that the expression
StrictTotalOrder.isStrictTotalOrder strictTotalOrder has type
Relation.Binary.IsStrictTotalOrder .Agda.Builtin.Equality._≡_
__<__91
打开Map模块的正确方法是什么?
答案 0 :(得分:3)
请注意,标准库的Data.AVL
已更新为接受严格的总订单,而不是基于命题相等性。
这几天很简单:
open import Data.String.Properties
open import Data.AVL strictTotalOrder
答案 1 :(得分:2)
Data.AVL.IndexedMap
模块用于(有限)映射,其中键和值具有一系列类型,与给定键关联的值与值共享索引。
这不是您想要的,因为您希望所有密钥都是String
。所以只需使用Data.AVL
(即带有非索引键的版本):
open import Data.String using (String)
open import Function using (const)
Key = String
postulate
Value : Set
open import Relation.Binary using (StrictTotalOrder)
open import Data.AVL (const Value) (StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder)
不幸的是,这仍然没有成功:
.Relation.Binary.List.Pointwise.Rel
(StrictTotalOrder._≈_ .Data.Char.strictTotalOrder)
(Data.String.toList x) (Data.String.toList x₁)
!= x .Agda.Builtin.Equality.≡ x₁ of type Set
when checking that the expression
StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder
has type IsStrictTotalOrder .Agda.Builtin.Equality._≡_ __<__10
这是因为Data.String.strictTotalOrder
使用逐点相等(在构成ℕ
的{{1}}的{{1}}列表上),Char
需要命题平等。因此完全相同的示例适用于例如String
键:
Data.AVL
因此,下一步需要将ℕ
转换为open import Data.Nat using (ℕ)
open import Function using (const)
Key = ℕ
postulate
Value : Set
import Data.Nat.Properties
open import Relation.Binary using (StrictTotalOrder)
open import Data.AVL (const Value) (StrictTotalOrder.isStrictTotalOrder Data.Nat.Properties.strictTotalOrder)
类型的内容。我现在就把它留给别人,但是我很高兴以后再看,有空的时候,如果你不能让它工作,也没有其他人接受它。
编辑添加:这是一种(可能非常过于复杂)的方式,将StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder
IsStrictTotalOrder (_≡_ {A = String}) _
从标准库转换为使用命题平等的东西:
StrictTotalOrder