The sum of products style
To explore datatype-generic functions in the sum of products style, we'll return to the familiar List
and Tree
types:
data List' a = Nil' | Cons' a (List' a) deriving (Show) data Tree a = Node a (Tree a) (Tree a) | Leaf a deriving (Show) aList = (Cons' 2 (Cons' 3 (Cons' 5 Nil'))) intTree = Node 2 (Leaf 3) (Node 5 (Leaf 7) (Leaf 11))
As a reference point, we define the datatype-specific size
functions:
sizeT (Leaf _) = 1 sizeT (Node _ lt rt) = 1 + (sizeT lt) + (sizeT rt) sizeL Nil' = 0 sizeL (Cons' _ xs) = 1 + (sizeL xs)
Instead of these ad hoc polymorphic functions, let's write them in a datatype-generic way. First, we define a type representation. In this section, we follow the generic programming style of Lightweight Implementation of Generics and Dynamics (LIGD) by
Cheney
and Hinze
, 2002, as revised in Libraries for Generic Programming in Haskell by Jeuring et al., 2009...