I'm experimenting with the Foldable
typeclass in Haskell, using the following data type as an example:
data Tree a = Empty
| Node (Tree a) a (Tree a)
If I use the DeriveFoldable
GHC extension, it seems to derive a Foldable
instance along the lines of
instance Foldable Tree where
foldMap _ Empty = mempty
foldMap f (Node l n r) = (foldMap f l) <> (f n) <> (foldMap f r)
i.e., an inorder traversal of the tree. However, I don't see anything obvious preventing a different Foldable
instance, such as a preorder traversal:
instance Foldable Tree where
foldMap _ Empty = mempty
foldMap f (Node l n r) = (f n) <> (foldMap f l) <> (foldMap f r)
Are there laws for the Foldable
typeclass that would make the preorder traversal instance unlawful?