Are Algebraic types just the combination of case classes and pattern matching?
Scala provides algebraic types and pattern matching in a way that is compatible with classes, but this is not what algebraic types are – it is Scala's realisation of the concept. Technically, pattern matching is not even needed for algebraic types; it just makes them must more convenient to use. One could instead use functions the pull apart the types. Early scheme's approach to ADTs would do just this.