나는 가능한 한 많은 수준의 다형성을 무시하고 Agda 프로젝트에서 2 주간 작업했습니다. 불행하게도 (또는 다행스럽게도) 나는 그것을 이해하기 시작할 필요가있는 지점에 도달 한 것 같습니다.우주 다형성의 적절한 사용
지금까지 수준 변수는 Rel
(또는 세 번째 인수 인 REL
)의 두 번째 인수로 필요할 때만 사용했습니다. 그렇지 않으면 나는 단지 Set
을 사용하여 그들을 생략했습니다. 이제 나는 레벨 (a
)을 명시 적으로 정량화하고 어떤 유형의 양식을 Set a
을 현재 기존 코드에 전달하려고 시도하는 클라이언트 코드를 가지고 있습니다.이 코드는 불충분하게 다형성이 있습니다. 아래 예에서 quibble
은 클라이언트 코드를 나타내며 _[_]×[_]_
과 ≈-List
은 기존 코드의 대표적인 코드입니다 (Set
). 이 유형 Set a
의 형식 인수를 취할 수 있도록 여기에
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
의 유도 정의를 확장 할 수 있지만, 그때에 관해서는 불분명 해요 어떻게 입력의 우주와 산출 관계가 바뀌어야한다. 그리고 나서 문제가 더 복잡한 정의로 쏟아져 나온다. 예를 들어 _[_]×[_]_
과 같이 진행 방법을 잘 모르는 경우가있다.
quibble
이 컴파일되도록 주어진 예제의 서명을 어떻게 일반화해야합니까? 내가 따라야 할 일반적인 규칙이 있습니까? 나는 this을 읽었다.
예, 내가 사용 시도했다'REL (목록 A) (A ⊔의 ℓ)''의 반환 유형으로 ≈- List'라고했지만,'_ [_] × [_] _ '을 (특히 A부터 D까지의 레벨 인수가 결과 유형에 언급되어야하는지 여부) 강제로 푸시 (push)하는 방법은 확실하지 않습니다. 하지만 추가 d 매개 변수를 추가하는 것은 내가 가진 코드로 트릭을 수행하는 것 같습니다. (어쩌면'quibble'은 결국 대표가 아니 었습니다.)'lift'와'lower'를 지적 해 주셔서 감사 드리며 또 다른 좋은 대답을 주셔서 감사합니다. – Roly