Czy import Haskell ma skutki uboczne?
Jakiś czas temu napisałem kod, który używaOverloadedStrings
tworzyćByteString
s 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ł?