我已經在Agda項目上工作了幾個星期,儘可能多地輕易地忽略了級別多態性。不幸的是(或者幸運的是)我似乎已經達到了需要開始理解它的程度。宇宙多態性的適當使用
到目前爲止,我只在需要它們作爲第二個參數時才使用級別變量作爲Rel
(或第三個參數爲REL
)的第二個參數。否則我省略了它們,直接使用Set
。現在我有一些客戶端代碼明確量化了a
級別,並試圖將某些類型的Set a
傳遞給我現有的代碼,現在的代碼現在不夠多態。在下面的示例中,quibble
代表客戶端代碼,而_[_]×[_]_
和≈-List
是我現有代碼的典型代碼,僅使用Set
。
module Temp where
open import Data.List
open import Data.Product
open import Level
open import Relation.Binary
-- Direct product of binary relations.
_[_]×[_]_ : {ℓ₁ ℓ₂ : Level} {A B C D : Set} → A × B → REL A C ℓ₁ → REL B D ℓ₂ → C × D → Set (ℓ₁ ⊔ ℓ₂)
(a , b) [ _R_ ]×[ _S_ ] (c , d) = a R c × b S d
-- Extend a setoid (A, ≈) to List A.
data ≈-List {ℓ : Level} {A : Set} (_≈_ : Rel A ℓ) : Rel (List A) ℓ where
[] : ≈-List _≈_ [] []
_∷_ : {x y : A} {xs ys : List A} → (x≈y : x ≈ y) → (xs≈ys : ≈-List _≈_ xs ys) → ≈-List _≈_ (x ∷ xs) (y ∷ ys)
quibble : {a ℓ : Level} {A : Set a} → Rel A ℓ → Rel (List (A × A)) ℓ
quibble _≈_ = ≈-List (λ x y → x [ _≈_ ]×[ _≈_ ] y)
在這裏,我可以用一個額外的等級參數a
延長≈-List
歸納定義,以便它可以採取Set a
類型的類型參數,但後來我不清楚如何輸入的宇宙和產出關係應該改變。然後問題泄漏到更復雜的定義中,例如_[_]×[_]_
,在那裏我不太確定如何繼續。
我應該如何概括給出的例子中的簽名,以便quibble
編譯?我可以遵循一般規則嗎?我讀過this。
是的,我用曾試圖'REL(表一)(一⊔ℓ)作爲''的返回類型≈-列表「,但不確定如何推送到'_ [_]×[_] _'(特別是在結果類型中是否應該提及集合A到D的級別參數)。但只是通過d參數添加額外的a似乎與我的代碼有關。 (也許'嘰嘰喳喳'畢竟沒有代表性。)謝謝你指出'lift'和'lower',另外一個非常好的答案。 – Roly