RECURSIVE TYPES

DR. ALEX GERDES

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY Today

• Recursive data types • Case expressions

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY Types are sets of values

• In Haskell

data Bool = False | True data Suit = Spades | Hearts | Diamonds | Clubs data Rank = Numeric Int | Jack | Queen | King | Ace data Card = Card Rank Suit

• In math: – Bool = {False, True} – Suit = {Spades, Hearts, Diamonds, Clubs} – Rank = {Numeric n | n ∈ Int} ∪ {Jack, Queen, King, Ace} – Card = {Card r s | r ∈ Rank, s ∈ Suit}

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY Circular definitions, do they make sense?

fac 0 = 1 fac n = n * fac(n-1) • Recursive functions: make sense, if you follow some basic rules f x = f x • Circular definitions of numbers? – They can make sense when seen as as equations in math, but as programs x,y :: Int they usually make no sense… x = x y = 2 * y • Circular definitions of lists? – They can make sense – This works in Haskell because Haskell ha,haha :: String uses lazy evaluation ha = "ha"++ha haha = take 10 ha

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY The meaning of circular definition of types

• What of values does this correspond to? – Nat = {Zero} ∪ {Succ n | n ∈ Nat} -- Peano's natural numbers • But this is still a circular definition… data Nat = Zero | Succ Nat • We can instead view the alternatives in definitions as rules that together generate the intended set: – Rule 1: Zero ∈ Nat – Rule 2: if n ∈ Nat then Succ n ∈ Nat • Recursive data types are also called inductive data types

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY Inductively defined sets

• By using induction we can define sets that contain infinitely many elements – Finite sets: enumerate all the elements – Infinite sets: give a finite set of rules that describe how to generate the elements • Recursive data type definitions create data types with infinitely many values – The values can also be arbitrarily large § For example, there is no limit on how long lists can be – We can work with data structures whose size is not known in advance

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY LIVE CODING

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY Recursive data types

• The values in these types are all linear sequences of things.

data Hand = Empty | Add Card Hand

data List a = Nil | a (List a)

data Nat = Zero | Succ Nat

-- Example values of these types: hand = Add c1 (Add c2 (Add c3 Empty) list = Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil))) number = Succ (Succ (Succ Zero))

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY Branching data structures

• How would we create a data type for flowcharts (action diagrams)? • More examples of flowcharts

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY LIVE CODING

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY A simpler -shaped data type

• Binary trees are trees where nodes have two subtrees

data BTree = Leaf | Node BTree Int Btree

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY KAHOOT

UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY UNIVERSITY OF GOTHENBURG | CHALMERS UNIVERSITY OF TECHNOLOGY