У импорта Haskell есть побочные эффекты?
Я написал код некоторое время назад, который используетOverloadedStrings
создаватьByteString
s из шестнадцатеричных строковых литералов, которые он декодирует с использованием функций, предоставляемыхbase16-bytestring
, Это работало нормально, но, кажется, я не понял это так хорошо, как думал.
То, что меня полностью запутало, так это. Почему
{-# LANGUAGE OverloadedStrings #-}
import Data.ByteString.Base16 ()
import qualified Data.ByteString as B
plaintext = "The message" :: B.ByteString
main = print plaintext
скомпилируйте и запустите OK, но если я удалю импорт дляData.ByteString.Base16
затем он не скомпилируется (аналогичноэтот вопрос):
test.hs:6:13:
No instance for (Data.String.IsString B.ByteString)
arising from the literal `"The message"'
СогласноHaskell Wikiимпорт, подобный этому, «полезен только для импорта экземпляров классов типов и ничего больше», но, насколько я вижу, исходный код base16-bytestring не определяет никаких экземпляров классов типов, толькоencode
а такжеdecode
функции.
Как импорт обеспечивает необходимый экземплярIsString
для кода для компиляции?