Ich schrieb vor einiger Zeit einen Code, der OverloadedStrings
verwendet, um ByteString
s aus Hex-codierten String-Literalen zu erstellen, die es mit den Funktionen von base16-bytestring
dekodiert. Das hat gut funktioniert, aber es scheint, dass ich es nicht so gut verstanden habe, wie ich dachte.Haben Haskell-Importe Nebenwirkungen?
Die Sache, die mich völlig verwirrt hat, ist dies. Warum funktioniert
{-# LANGUAGE OverloadedStrings #-}
import Data.ByteString.Base16()
import qualified Data.ByteString as B
plaintext = "The message" :: B.ByteString
main = print plaintext
kompilieren und ausführen OK, aber wenn ich den Import für Data.ByteString.Base16
entfernen dann scheitert es zu kompilieren (ähnlich this question):
test.hs:6:13:
No instance for (Data.String.IsString B.ByteString)
arising from the literal `"The message"'
Nach dem Haskell Wiki, ein Import wie dies "Das ist nützlich, um nur Instanzen von typeclasses und nichts anderes zu importieren", aber soweit ich sehen kann, definiert der Quellcode von base16-bytestring keine typeclass-Instanzen, sondern nur die Funktionen encode
und decode
.
Wie stellt der Import die erforderliche Instanz von IsString
für den zu kompilierenden Code bereit?