我试图了解这种数据类型(方)如何表示平方矩阵。
type Square = Square' Nil
data Square' t a = Zero (t (t a) ) | Succ (Square' (Cons t) a)
data Nil a = Nil
data Cons t a = Cons a (t a)
所以。 t
在这里是什么?我想这是上面声明的类型之一。
我决定从最简单的开始,所以
Zero (Nil (Nil Int))
如果我将整数4作为值,这是矩阵(4)
吗?
假设它是某种东西。现在,这是什么:
Succ ( Zero (Cons t) a)
如果我对t
是正确的,那么也许这必须代表一些2×2矩阵,但是它的值是什么?
Succ (Zero (Cons Nil) a)
感谢您对我的方形矩阵理解的帮助。
答案 0 :(得分:8)
让我们介绍一些非正式的概念来指导直觉。写T :> U
表示T
是具有一个或多个子情况的求和类型,而U
是其中之一(至少对某些同构取模)。我们还将在类型之间使用=
来表示同构。
因此,根据定义,我们有
Square a = Square' Nil a
:> { taking the Zero branch }
Nil (Nil a)
=
()
因此,这种情况表示空的“ 0x0”矩阵。
Square a = Square' Nil a
:> { taking the Succ branch }
Square' (Cons Nil) a
:> { taking the Zero branch }
Cons Nil (Cons Nil a)
= { def of Cons }
(Cons Nil a, Nil (Cons Nil a))
= { def of Cons }
((a, Nil a), Nil (Cons Nil a))
= { def of Nil }
((a, ()), ())
=
a
所以,这是1x1矩阵。
Square a = Square' Nil a
:> { taking the Succ branch }
Square' (Cons Nil) a
:> { taking the Succ branch again }
Square' (Cons (Cons Nil)) a
:> { taking the Zero branch }
Cons (Cons Nil) (Cons (Cons Nil) a)
=
Cons (Cons Nil) (a, Cons Nil a)
=
Cons (Cons Nil) (a, a, Nil a)
=
Cons (Cons Nil) (a, a, ())
=
Cons (Cons Nil) (a, a)
=
((a,a), Cons Nil (a, a))
=
((a,a), (a,a), Nil (a, a))
=
((a,a), (a,a), ())
=
((a,a), (a,a))
所以,这是2x2矩阵。
我们现在应该能够发现一些模式。进入Succ
分支,我们最终得到一种形式的
Square' (Cons (Cons (Cons (...(Cons Nil))))) a
最后一个Zero
变成哪个,
F (F a)
where F = (Cons (Cons (Cons (...(Cons Nil)))))
请注意,我们考虑了所有可能的情况,因此最终类型的确必须采用F (F a)
的形式,其中某些F
属于上述形式。
现在,我们可以看到F a
与(a,a,a,....)
是同构的,其中a
的数量N恰好是{{ {1}}。因此,Cons
将产生一个方矩阵(N元组的N元组=方矩阵)。
让我们通过归纳F
个数字来证明这一点。对于零情况,我们有F (F a)
,实际上,根据需要,零Cons
出现了:
F = Nil
对于归纳情况,假设N个a
的{{1}}是N个Nil a = ()
的{{1}}。要证明的N + 1种情况将说明F a
是Cons
,具有N + 1个(a,a,...)
。确实:
a
QED。