Difference between revisions of "Algebraic Data Structures"

From The fun Wiki
Jump to navigation Jump to search
 
(3 intermediate revisions by the same user not shown)
Line 28: Line 28:
 
== Wheels ==
 
== Wheels ==
  
Wheels are a fixed-point of linked-lists, as in:
+
A wheel is a fixed-point of linked-lists, as in:
  
 
   wheel = Cons 1 (Cons 2 (Cons 3 wheel));
 
   wheel = Cons 1 (Cons 2 (Cons 3 wheel));
 
   wheel = Fix (\f -> Cons 1 (Cons 2 (Cons 3 f)));
 
   wheel = Fix (\f -> Cons 1 (Cons 2 (Cons 3 f)));
 +
  wheel = <| 1,2,3 |>;
 +
 
== Binary Trees ==
 
== Binary Trees ==
  
 
   data BTree1 = Fork a b | Leaf n;
 
   data BTree1 = Fork a b | Leaf n;
 
   data BTree2 = Fork n a b | Leaf n;  
 
   data BTree2 = Fork n a b | Leaf n;  
 +
  data BTree3 = Fork n a b | Leaf;
 
== Maybe Monad ==
 
== Maybe Monad ==
 
   data Maybe = Just x | Nothing;
 
   data Maybe = Just x | Nothing;

Latest revision as of 11:18, 3 May 2022

Algebraic data types are a fundamental part of modern functional programming languages, which allows the definition of complex composite types. They are algebraic, built upon two basic operations: products and sums.

Sum types encode alternative data. A sum type is either of value A or B, but not both. A product type, on the other hand, combines different values together, into a single unit.

 data Sum  = Sum1 a | Sum2 b;
 data Prod = Prod a b; 

These two operations can be further combined to form complex data structures, as we shall see in the examples below.

Church Encoding

Scott Encoding

Boolean Values

 data Bool = False | True;

Peano Numbers

 data Num = Succ x | Zero; 

Tuples

 data Pair = Pair a b;
 data Trio = Trio a b c;
 data Quad = Quad a b c d;

Linked-lists

 data List = Cons a b | Nil;

Wheels

A wheel is a fixed-point of linked-lists, as in:

 wheel = Cons 1 (Cons 2 (Cons 3 wheel));
 wheel = Fix (\f -> Cons 1 (Cons 2 (Cons 3 f)));
 wheel = <| 1,2,3 |>;

Binary Trees

 data BTree1 = Fork a b | Leaf n;
 data BTree2 = Fork n a b | Leaf n; 
 data BTree3 = Fork n a b | Leaf; 

Maybe Monad

 data Maybe = Just x | Nothing;

Either Monad

 data Either = Left y | Right x;