This post uses “type constructor” when it means “data constructor”. Type constructors make types, while data constructors make (data) values (of a type).
I’m not sure why they’re called data constructors instead of value constructors in Haskell, but I remember being very confused by the “data Foo = Foo Whatever” idiom because the Foo on the left was a type constructor while the Foo on the right was a value constructor.
I think GHC’s MultiWayIf extension (and PatternGuards, which is just part of the base Haskell2010 standard now) gets you a unified condition syntax as well, although if you have a complicated discriminator you’ll want to bind it to a short name first to save yourself some typing.
(There is a difference in terminology here where what you call a pattern guard is just called a guard in Haskell land, and a pattern guard in Haskell is being able to use an arbitrary pattern match as a boolean condition and to bind variables in a (Haskell) guard.)