平方矩阵的嵌套数据类型

arr*_*ryn 7 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)
Run Code Online (Sandbox Code Playgroud)

所以。这是t什么 我想这是上面声明的类型之一。我决定从最简单的开始

Zero (Nil (Nil Int))
Run Code Online (Sandbox Code Playgroud)

如果我将整数4作为值,这是矩阵(4)吗?

假设它是某种东西。现在,这是什么:

Succ ( Zero (Cons t) a) 
Run Code Online (Sandbox Code Playgroud)

如果我是正确的t,那么这也许必须代表一些2×2矩阵,但是它的值是多少?

Succ (Zero (Cons Nil) a) 
Run Code Online (Sandbox Code Playgroud)

感谢您在我对它是方矩阵的理解方面的帮助。

chi*_*chi 8

让我们介绍一些非正式的符号来指导直觉。写T :> U来表示这T是具有一个或多个子情况的和类型,并且U是其中一种(至少对某些同构取模)。我们还将=在类型之间使用表示同构。

因此,根据定义,我们有

Square a = Square' Nil a
:> { taking the Zero branch }
Nil (Nil a)
=
()
Run Code Online (Sandbox Code Playgroud)

因此,这种情况表示空的“ 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
Run Code Online (Sandbox Code Playgroud)

因此,这是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))
Run Code Online (Sandbox Code Playgroud)

因此,这是2x2矩阵。

现在,我们应该能够发现一些模式。在Succ分支中,我们最终得到一种形式的形式

Square' (Cons (Cons (Cons (...(Cons Nil))))) a
Run Code Online (Sandbox Code Playgroud)

最终Zero

F (F a)
  where F = (Cons (Cons (Cons (...(Cons Nil)))))
Run Code Online (Sandbox Code Playgroud)

请注意,我们考虑了所有可能的情况,因此最终类型的确必须F (F a)具有F上面某些形式的形式。

现在,人们可以看到,F a同构(a,a,a,....),其中数N a的IT确切的数N Cons的定义中,ES F。因此,F (F a)将产生一个方矩阵(N个元组的N个元组=方矩阵)。

让我们通过归纳Conses 数来证明这一点。对于零的情况,我们有F = Nil,实际上,正如我们想要的,零a出现:

Nil a = ()
Run Code Online (Sandbox Code Playgroud)

对于感应情况,假设F aN Conses为(a,a,...)N as。要证明的N + 1种情况将陈述(Cons F) a(a,a,...,a)N + 1个a。确实:

Cons F a
=
(a, F a)
=
(a, (a,a....))   { 1 + N a's , as wanted }
Run Code Online (Sandbox Code Playgroud)

QED。