Adding new datatypes vs. adding new functions is the core tension between OOP and FP. It's really easy to add new functionality to existing datatypes in functional programming, and really easy to add new datatypes in OOP.
There's some very interesting research on resolving this issue: http://www.cs.ucla.edu/~todd/research/icfp02.html