As importações do Haskell têm efeitos colaterais?
Eu escrevi algum código há um tempo atrás, que usaOverloadedStrings
para criarByteString
s de literais String codificados em hexadecimal, que ele decodifica usando as funções fornecidas porbase16-bytestring
. Isso funcionou bem, mas parece que eu não entendi tão bem quanto eu pensava.
O que me deixa completamente confuso é isso. Porque
{-# LANGUAGE OverloadedStrings #-}
import Data.ByteString.Base16 ()
import qualified Data.ByteString as B
plaintext = "The message" :: B.ByteString
main = print plaintext
compilar e executar OK, mas se eu remover a importação paraData.ByteString.Base16
então ele não compila (semelhante aessa questão):
test.hs:6:13:
No instance for (Data.String.IsString B.ByteString)
arising from the literal `"The message"'
De acordo comWiki do Haskell, uma importação como esta é "útil para importar apenas instâncias de typeclasses e nada mais", mas, tanto quanto eu posso ver, o código fonte base16-bytestring não define nenhuma instância typeclass, apenas oencode
edecode
funções.
Como a importação fornece a instância necessária deIsString
para o código para compilar?