我能夠輕易獲得密鑰列表如下:如何獲取Data.AVL.Tree中的值列表?
open import Relation.Binary
open import Relation.Binary.PropositionalEquality using (_≡_)
module AVL-Tree-Functions
{ k v ℓ } { Key : Set k }
(Value : Key → Set v)
{ _<_ : Rel Key ℓ }
(isStrictTotalOrder : IsStrictTotalOrder _≡_ _<_)
where
open import Data.AVL Value isStrictTotalOrder public
open import Data.List.Base
open import Function
open import Data.Product
keys : Tree → List Key
keys = Data.List.Base.map proj₁ ∘ toList
但我不如何指定返回值的列表的功能類型明確。這是我第一次嘗試:
-- this fails to typecheck
values : Tree → List Value
values = Data.List.Base.map proj₂ ∘ toList
與此相關的,我也感到困惑的Value
在Data.AVL聲明。用(Value : Key → Set v)
,它看起來像樹中每個值的類型取決於密鑰?或類似的東西。那麼我想,proj₂將返回Set v
類型的東西,所以我嘗試這樣做:
-- this also fails to typecheck
values : Tree → List (Set v)
values = Data.List.Base.map proj₂ ∘ toList
但是,這並不工作,要麼(它失敗,不同的錯誤)。請顯示如何從Data.AVL.Tree獲取值的列表(或解釋爲什麼不可能)。獎金:解釋爲什麼我的兩次嘗試失敗。
P.s.這是使用Agda版本2.4.2.3和agda-stdlib。
這是很難在gallais'和user3237465的答案之間做出決定。我跟user3237465去了,因爲'索引列表'的方法足以解決我的特殊問題。非常感謝,並且爲了這個出色的,內容豐富的答案已經成爲gallais的代表。 – m0davis