导入 `Cubical.Data.Nat` 会破坏 `isOfHLevel→isOfHLevelDep`
Importing `Cubical.Data.Nat` breaks `isOfHLevel→isOfHLevelDep`
以下小 Agda 程序类型检查:
{-# OPTIONS --cubical #-}
module _ where
open import Cubical.Core.Everything
open import Cubical.Foundations.Everything
module _ (A : Type) (P : A → Type) (PIsProp : ∀ x → isProp (P x)) where
r : isOfHLevelDep 2 P
r = isOfHLevel→isOfHLevelDep 2 λ t → isOfHLevelSuc 1 (PIsProp t)
但是,如果我也添加 import Cubical.Data.Nat
(我什至不需要打开它!),这会失败:
{-# OPTIONS --cubical #-}
module _ where
open import Cubical.Core.Everything
open import Cubical.Foundations.Everything
import Cubical.Data.Nat
module _ (A : Type) (P : A → Type) (PIsProp : ∀ x → isProp (P x)) where
r : isOfHLevelDep 2 P
r = isOfHLevel→isOfHLevelDep 2 λ t → isOfHLevelSuc 1 (PIsProp t)
{a0 a1 : A} (b0 : P a0) (b1 : P a1) →
isOfHLevelDep 1 (λ p → PathP (λ i → P (p i)) b0 b1)
!=
(b0 : P a0) (b1 : P a1) →
isOfHLevelDep 1 (λ p → PathP (λ i → P (p i)) b0 b1)
because one is an implicit function type and the other is an
explicit function type
when checking that the expression
isOfHLevel→isOfHLevelDep 2 λ t → isOfHLevelSuc 1 (PIsProp t) has
type
(b0 : P a0) (b1 : P a1) →
isOfHLevelDep 1 (λ p → PathP (λ i → P (p i)) b0 b1)
如果我用一个空洞替换 isOfHLevel→isOfHLevelDep
的参数 2
并询问 Agda 在该上下文中 2
的类型是什么,它显示:
Goal: HLevel
Have: ⦃ _ : Cubical.Data.Nat.Unit ⦄ → Cubical.Data.Nat.ℕ
这个问题是由于 2
是某种重载文字引起的吗?如何指定我想在类型 HLevel
上使用 2
?
编辑添加:如果我不使用文字,而是写 suc (suc zero)
,那么就可以了;但是,我还是想在那里使用文字 2
。
确实不同之处在于 Cubical.Data.Nat
导入了文字重载机制,即使只有 Nat
的一个实例。
HLevel
应该只是 Nat
本身顺便说一句。这种差异似乎导致 Agda 避免插入一些隐式参数应用程序。
您可以通过在 r
的正文中添加隐式参数应用程序来解决此问题:
module _ (A : Type) (P : A → Type) (PIsProp : ∀ x → isProp (P x)) where
r : isOfHLevelDep 2 P
r = isOfHLevel→isOfHLevelDep 2 (λ t → isOfHLevelSuc 1 (PIsProp t)) {_} {_}
确实这个(或一个更小的测试用例)应该被记录为一个 agda 问题。
尽管何时插入隐式应用程序的逻辑已经很棘手,因为它必须尝试并适应冲突的用例。
以下小 Agda 程序类型检查:
{-# OPTIONS --cubical #-}
module _ where
open import Cubical.Core.Everything
open import Cubical.Foundations.Everything
module _ (A : Type) (P : A → Type) (PIsProp : ∀ x → isProp (P x)) where
r : isOfHLevelDep 2 P
r = isOfHLevel→isOfHLevelDep 2 λ t → isOfHLevelSuc 1 (PIsProp t)
但是,如果我也添加 import Cubical.Data.Nat
(我什至不需要打开它!),这会失败:
{-# OPTIONS --cubical #-}
module _ where
open import Cubical.Core.Everything
open import Cubical.Foundations.Everything
import Cubical.Data.Nat
module _ (A : Type) (P : A → Type) (PIsProp : ∀ x → isProp (P x)) where
r : isOfHLevelDep 2 P
r = isOfHLevel→isOfHLevelDep 2 λ t → isOfHLevelSuc 1 (PIsProp t)
{a0 a1 : A} (b0 : P a0) (b1 : P a1) →
isOfHLevelDep 1 (λ p → PathP (λ i → P (p i)) b0 b1)
!=
(b0 : P a0) (b1 : P a1) →
isOfHLevelDep 1 (λ p → PathP (λ i → P (p i)) b0 b1)
because one is an implicit function type and the other is an
explicit function type
when checking that the expression
isOfHLevel→isOfHLevelDep 2 λ t → isOfHLevelSuc 1 (PIsProp t) has
type
(b0 : P a0) (b1 : P a1) →
isOfHLevelDep 1 (λ p → PathP (λ i → P (p i)) b0 b1)
如果我用一个空洞替换 isOfHLevel→isOfHLevelDep
的参数 2
并询问 Agda 在该上下文中 2
的类型是什么,它显示:
Goal: HLevel
Have: ⦃ _ : Cubical.Data.Nat.Unit ⦄ → Cubical.Data.Nat.ℕ
这个问题是由于 2
是某种重载文字引起的吗?如何指定我想在类型 HLevel
上使用 2
?
编辑添加:如果我不使用文字,而是写 suc (suc zero)
,那么就可以了;但是,我还是想在那里使用文字 2
。
确实不同之处在于 Cubical.Data.Nat
导入了文字重载机制,即使只有 Nat
的一个实例。
HLevel
应该只是 Nat
本身顺便说一句。这种差异似乎导致 Agda 避免插入一些隐式参数应用程序。
您可以通过在 r
的正文中添加隐式参数应用程序来解决此问题:
module _ (A : Type) (P : A → Type) (PIsProp : ∀ x → isProp (P x)) where
r : isOfHLevelDep 2 P
r = isOfHLevel→isOfHLevelDep 2 (λ t → isOfHLevelSuc 1 (PIsProp t)) {_} {_}
确实这个(或一个更小的测试用例)应该被记录为一个 agda 问题。
尽管何时插入隐式应用程序的逻辑已经很棘手,因为它必须尝试并适应冲突的用例。