The misnamed Visitor pattern does exactly this: decouple the operations on a polymorphic object structure from the implementation of the structure. It can be used in a way similar to FP-style pattern matching (although with more boilerplate), but is more flexible because the implementations accepting a Visitor are not coupled to the constructors of a data structure (e.g., a DAG object could accept a tree visitor, or vise versa). It would be interesting to have a language that provides convenient syntactic sugar for the visitor pattern.
EDIT: Just to clarify: The visitor pattern is usually presented in the context of "visiting" nodes in a recursive traversal. But the pattern is actually independent from the "traversal" use case. Its essence is really just the "switching", or case distinction, over an algebraic sum-like type (or over a type that provides a sum type view of itself).