What are your objections to OverloadedStrings?
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]