Nem reguláris algebrai adattípusok

Irodalom

Chris Okasaki:
Fast Exponentiation to Square Matrices: An Adventure in Types

Bevezető nem reguláris példa

Páros indexű helyeken a, páratlan indexű helyeken b típusú adatot tartalmazó lista:

data AlterList a b
  = Nil
  | Cons a (AlterList b a)
      deriving (Eq, Ord, Show, Typeable, Data)

Példa:

Test>
Cons True (Cons 'x' (Cons False Nil)) :: AlterList Bool Char

Négyzetes mátrixok

Típusok:

type Quad a = (a,a,a,a) 
data Square1 a 
   = Zero1 a 
   | Succ1 (Quad (Square1 a))

Példa

NestedTypes9e05c4bafc55c4add2855b7c0e135438.png

Példa:

p2 = Succ1 (Succ1 (Zero1 1,Zero1 2,Zero1 3,Zero1 4)
           ,Succ1 (Zero1 5,Zero1 6,Zero1 7,Zero1 8)
           ,Succ1 (Zero1 9,Zero1 0,Zero1 1,Zero1 2)
           ,Succ1 (Zero1 3,Zero1 4,Zero1 5,Zero1 6))
  :: Square1 Int

Négyzetes mátrixok másként

Típus:

data Square2 a 
   = Zero2 a 
   | Succ2 (Square2 (Quad a))

Példa:

p3 = Succ2 (Succ2 (Zero2 
      ((0,1,2,3)
      ,(4,5,6,7)
      ,(8,9,0,1)
      ,(2,3,4,5))
  )) :: Square2 Int