Pattern matching for abstract data types is precisely what my "Abstract Patterns" paper was about. Abstract patterns are almost the same as the "views" that have been proposed for Haskell, but "abstract pattern" is a rather clearer name.