In Haskell String _is_ a list of chars, there is nothing to coerce, it is the same thing. Therefore both "" == "" and [] == [] are true, and "" == [1,2,3] isn't even a thing. And this is how it is consistent: you can only compare the same things, and it always works :)