TL; DR:我想要在Idris REPL中使用cong
的一两个示例,以帮助我更好地理解它。
概念上对泛型相等类型的定义如下:
data (=) : a -> b -> Type where
Refl : x = x
当我第一次遇到这个问题时,我对语法感到非常困惑。 (我一直认为=
是运算符而不是类型。)但是在REPL中使用它可以帮助我理解。例如,我们可以声明代表假相等的类型:
λ> 2 + 2 = 5
4 = 5 : Type
λ> 2 = "wombat"
2 = "wombat" : Type
但是,=
的唯一构造函数是Refl,我们只能在两个参数相等的情况下使用它。
λΠ> the (4 = 4) Refl
Refl : 4 = 4
λΠ> the (4 = 5) Refl
... type mismatch
因此,现在我试图通过在REPL中进行实验来了解cong
。
函数cong
证明,如果两个值相等,则应用
函数对他们产生相等的结果。我找到了定义。
cong : {f : t -> u} -> (a = b) -> f a = f b
cong Refl = Refl
例如,如果我定义...
λ> :let twoEqTwo = the (2 = 2) Refl
defined
...然后我希望能够证明两边加1会导致另一个相等。
λΠ> :let ty = (S 2 = S 2)
defined
λΠ> the ty (cong twoEqTwo)
...type mismatch
有人可以给我演示在REPL中使用cong
的一个或两个示例吗?
答案 0 :(得分:2)
2
的类型错误。他们在Integer
中默认使用twoEqTwo
类型,因为它们没有其他约束。请参见不受约束的2
:
idris> 2
2 : Integer
但是,在ty
中,您说的是S 2
。 S
迫使整个事情在Nat
中起作用:
idris> S 2
3 : Nat
也使twoEqTwo
在Nat
中工作:
idris> :let twoEqTwo = the (the Nat 2 = 2) Refl
idris> the (S 2 = S 2) twoEqTwo
Refl : 3 = 3
请注意,如果让类型推断看到整个表达式,它可以对其进行分类:
idris> the (S 2 = S 2) (cong (the (2 = 2) Refl))
Refl : 3 = 3