Czy import Haskell ma skutki uboczne?

Jakiś czas temu napisałem kod, który używaOverloadedStrings tworzyćByteStrings z szesnastkowo zakodowanych literałów ciągów, które dekoduje przy użyciu funkcji dostarczonych przezbase16-bytestring. To działało dobrze, ale wydaje mi się, że nie rozumiałem tego tak dobrze, jak myślałem.

To, co mnie całkowicie myli, to to. Dlaczego

{-# LANGUAGE OverloadedStrings #-}

import Data.ByteString.Base16 ()
import qualified Data.ByteString as B

plaintext = "The message" :: B.ByteString

main = print plaintext

skompiluj i uruchom OK, ale jeśli usunę import dlaData.ByteString.Base16 wtedy nie kompiluje się (podobnie jakto pytanie):

test.hs:6:13:
No instance for (Data.String.IsString B.ByteString)
  arising from the literal `"The message"'

WedługWiki Haskell, import taki jak ten jest „użyteczny tylko do importowania wystąpień klas typów i niczego innego”, ale o ile widzę, kod źródłowy base16-bytestring nie definiuje żadnych wystąpień klas typowych, tylkoencode idecode Funkcje.

W jaki sposób import zapewnia niezbędne wystąpienieIsString aby kod się skompilował?

questionAnswers(1)

yourAnswerToTheQuestion