As a non-fan of OverloadedStrings, I'm not sure how I feel about this.
I think that sort of ambiguity is part of Haskell. It rescinds a bit on the HM promise of never having to write types, but Haskell has long rescinded on that in spirit and practice. It leads to a bit of beginner trouble, but, again, not any more than numeric literals do.
I welcome overloaded lists because I feel it'll make more libraries willing to expose Set-typed interfaces when that's the honest contract that should be upheld by the interface. That's what I want my types to tell me—not just what's syntactically convenient.
Yes. Data.ByteString.Char8.pack does not form an isomorphism with Data.ByteString.Char8.unpack. It is thus not interchangeable with String.
Example:
Prelude Data.ByteString.Char8> putStrLn . unpack . pack $ "Российская Федерация"
>AA89A:0O $545@0F8O
And here the correct result with Data.Text: Prelude Data.Text> putStrLn . unpack . pack $ "Российская Федерация"
Российская Федерация "foo" :: String
and with we have "foo" :: IsString a => a
much like 3 :: Num a => a
It inherits all of the same weaknesses and strengths that we have with the Num typeclass. instance IsString () where
fromString = const ()
And there's nothing wrong with it! pack "<unicode> string"
fromList [1,2,3,4,4.000000000000000000000000001]