我想定义以下类型的函数
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
但是我对实现有些困惑。
我知道我会写
pairEquality' :
a1 = b1
-> a2 = b2
-> (a1, a2) = (b1, b2)
但是在我需要使用它的地方似乎并没有编译(这是另一个问题:这两个函数之间的最大区别是什么?)
答案 0 :(得分:2)
第一个实现非常简单。将元组拆分成pairEquality (a, b) (x, y) prf1 prf2 = ?t
并检查孔之后,您已经看到编译器推断出prf1 : a = x
,prf2: b = y
,a:
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
pairEquality (x, y) (x, y) Refl Refl = Refl
在pairEquality
中解构元组,在pairEquality'
中构建元组。通常,后者是一种更好的方法,我想您可以在调用方函数中进行更改,以便可以使用它。
答案 1 :(得分:0)
我实际上发现我可以根据pairEquality
将pairEquality'
定义为
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
pairEquality (a1, a2) (b1, b2) = pairEquality' {a1} {a2} {b1} {b2}