Haskell equivalent of Kotlin's invariant types
In Kotlin i can do
sealed class Substance {
object Uranus : Substance()
object Mercury: Substance()
object Ammonia : Substance()
}
data class DangerousBox(val item: T)
fun main() {
val uranus = DangerousBox(Substance.Uranus)
val mercury: DangerousBox = uranus
}
Now i have invariant types DangerousBox, DangerousBox etc., so sample above would't compile.
How make it in Haskell?
Ideally i would like to have types
uranus :: DangerousBox Uranus
uranus = DangerousBox Mercury...