平方矩阵的嵌套数据类型

时间:2019-09-13 07:14:22

标签: haskell types nested

我试图了解这种数据类型(方)如何表示平方矩阵。

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) 

感谢您对我的方形矩阵理解的帮助。

1 个答案:

答案 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 aCons,具有N + 1个(a,a,...)。确实:

a

QED。