Интересно, можно ли реализовать что-то вроде contrib
Data.SortedMap
, где, например, тип ключа может быть Key n
, а тип значения - Value n
, где n
- это то же самое Nat
?
. Для Map (Key n) (Value n)
(который завершается ошибкой с "Нет такой переменной n") некоторые обычные функции могут иметь такие типы
Key : Nat -> Type
Value : Nat -> Type
lookup : {n : Nat} -> Key n -> WonderMap Key Value -> Maybe (Value n)
insert : {n : Nat} -> Key n -> Value n -> WonderMap Key Value -> WonderMap Key Value
Я попробовал следующее, используя зависимые пары
MyMap : Type
MyMap = SortedMap (n ** Key n) (n **Value n)
, но я думаю, что n
здесь не то же самое, поэтому он интерпретируется как
MyMap = SortedMap (n ** Key n) (x ** Value x)
другими словами, ключ и типы значений не «связаны» так, как мне бы хотелось, т. е. Value n
может храниться только в Key n
и lookup
, поскольку Key n
всегда возвращает Value n
.
И
MyOtherMap : Nat -> Type
MyOtherMap n = SortedMap (Key n) (Value n)
должны создать тип карты с индексом n : Nat
, поэтому я не смог сохранить значения Value 1
под Key 1
keys и Value 7
значения в ключах Key 7
на той же карте.
Возможно ли реализовать нужный тип карты, если семейство типов ключей используется для хранения соответствующего семейства типов значений? (Если не считать одного MyOtherMap
для каждого n : Nat
, а затем объединить все эти элементы в более крупную структуру, см. Мой ответ)