Я работаю в течение нескольких недель над проектом 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)
Здесь я могу продлить индуктивное определение ≈-List
с дополнительным параметром уровня a
, чтобы он мог принять аргумент типа типа Set a
, но я неясно, как вселенные ввода и выходные отношения должны измениться. И тогда проблема выливается в более сложные определения, такие как _[_]×[_]_
, где я еще менее уверен, как действовать.
Как обобщать сигнатуры в приведенном примере, так что quibble
компилируется? Существуют ли общие правила, которым я могу следовать? Я читал this.
Да, я попытался с помощью 'Rel (список А) (а ⊔ ℓ)' в качестве возвращаемого типа '≈- List', но не был уверен, как перейти к _ _ [_] × [_] _ '(в частности, следует указать в аргументе уровня аргументы уровня от A до D). Но просто добавление дополнительных параметров a-d, похоже, делает трюк с кодом, который у меня есть. (Может быть, 'quibble' не был репрезентативным в конце концов.) Спасибо, что указали« лифт »и« нижний », а для другого действительно хороший ответ. – Roly