In Scala I can describe such ADT:
sealed trait Foo
case class A(a: Int) extends Foo
case class B(b: String) extends Foo
case class C(a: A, b: B) extends Foo
How can I do the same in Haskell?
data Foo = A Int | B String | C A B
It doesn't work, because A and B are not types. Should I use GHC extensions to do it?