Species subtraction made simple  > module Virtual where > import
Control.Applicative > import Test.QuickCheck  Yesterday on
#haskell, augur asked me to explain how subtraction works for
combinatorial species. (For an introduction to species, see my
paper from the 2010 Haskell Symposium.) For example, given the
equation  M = 1 + X  defining the species M (which corresponds
to the Haskell type constructor Maybe), our algebraic
sensibilities tell us this can be rewritten as  X = M - 1  but
can we make sense of this combinatorially? Addition has an
obvious combinatorial interpretation (disjoint union), and so
does multiplication (pairing), but what does subtraction mean?
Once we allow subtraction, we have to assign meaning to
expressions like Void - Bool, which apparently must be a species
with negative two inhabitants. What on earth could that mean!?
Combinatorics is all about counting things; we can have zero
structures, or one structure, or seventy-three structures, but
surely we can’t have a negative number o