我收到x != y of type Y when checking that the pattern p(y) has type Z
形式的奇怪错误。我不知道为什么或如何得到这个,并希望解决这个问题。问题实例如下;谢客。
假设我有一套,
postulate A : Set
以及将其元素解释为集合的方法,
postulate F : A → Set
然后使用该组的对,
record B : Set where field s t : A
我可以在其上构建一个参数化类型:
data C : A → Set where MkC : (b : B) → F (B.s b) → C (B.t b)
现在我想成为一个函数
ABCF : ∀ a → (f : A → A) → C a → C (f a)
ABCF t f e = {!!}
我通过C-c C-c
对第三个参数进行模式匹配来实现
这样做让我
ABCF .(B.t b) f (MkC b x) = {!!}
然后C-c C-c
上的另一个b
产生
ABCF t f (MkC record { s = s ; t = .t } x) = ?
但此外壳后面紧跟一个错误:
B.t b != t of type A
when checking that the pattern MkC record { s = s ; t = .t } x has
type C t
用.t
替换t'
也无法解决此问题。
任何有助于指出此错误背后原因以及如何解决此问题的帮助将非常感谢!
修改
如下所述,上述问题可能是由于一个错误,但相反的情况呢?
FCBA : ∀ {a} (f : A → A) → C (f a) → C a
FCBA {a} f (MkC record { s = s ; t = .(f a) } x) = ?
我们如何解决这个问题?哪个附带错误
B.t b != f a of type A
when checking that the pattern MkC record { s = s ; t = .(f a) } x
has type C (f a)
答案 0 :(得分:2)
看起来像个错误。如果您将不可访问的模式与常规模式交换,一切正常:
ABCF : ∀ a → (f : A → A) → C a → C (f a)
ABCF .t f (MkC record { s = s ; t = t } x) = {!!}
但a
无论如何应该是隐含的,因为它总是可以从C a
推断出来。那就没问题了:
ABCF : ∀ {a} → (f : A → A) → C a → C (f a)
ABCF f (MkC record { s = s ; t = t } x) = {!!}
如果由于类型太具体而无法直接进行模式匹配,则可以对其进行概括:
open import Relation.Binary.PropositionalEquality
FCBA : ∀ {a} (f : A → A) → C (f a) → C a
FCBA {a} f c with f a | inspect f a | c
... | .b | [ r ] | MkC record { s = s ; t = b } x = {!!}
此处我们将f a
概括为b
并记住f a ≡ b
(在这种情况下,此类记忆可能无用,但如果您不想忘记{{} 1}}实际上是b
)。这允许在f a
上进行模式匹配,交换不可访问的和常规模式,如前所述。
但这不是一招 - 这是一个丑陋的黑客。您可能应该在Agda邮件列表上询问为什么需要进行此交换以及这是否是预期的行为。