-- ==================================================
-- Lecture 4: Type systems
-- ==================================================
-- polymorphism

length' :: [Integer] -> Integer
length' [] = 0
length' (x:xs) = 1 + length' xs

-- ==================================================
-- recursive data types

data Tree a = Lf a | Tree a :^: Tree a
	deriving Show

leaves, leaves' :: Tree a -> [a]

leaves (Lf l) = [l]
leaves (l :^: r) = leaves l ++ leaves r

leaves' t = leavesAcc t [ ]
	where
		leavesAcc (Lf l) = (l:)
		leavesAcc (l :^: r) = leavesAcc l . leavesAcc r

mytree = (Lf 12 :^: (Lf 23 :^: Lf 13)) :^: Lf 10

-- mytree :: Tree Int

-- ==================================================
