Declarative vs. procedural is orthogonal to data oriented vs. object oriented.
The functional way to make a declarative interface would be to have a single type, `Expression`, and all operators take expressions and return expressions.
However, I would argue the declarative vs. procedural decision is much more important to the resulting code structure then whether you use a single object type or multiple object types with inheritance.