Я написал код некоторое время назад, который использует OverloadedStrings
для создания ByteString
из строковых литералов с шестнадцатеричным кодированием, которые он декодирует, используя функции, предоставляемые base16-bytestring
. Это сработало хорошо, но, похоже, я не понял его так хорошо, как я думал.
Вещь, которая меня полностью запутала, такова. Почему
{-# LANGUAGE OverloadedStrings #-}
import Data.ByteString.Base16 ()
import qualified Data.ByteString as B
plaintext = "The message" :: B.ByteString
main = print plaintext
скомпилировать и запустить ОК, но если я удалю импорт для 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 не определяет экземпляры typeclass, а только функции encode
и decode
.
Как этот импорт предоставляет необходимый экземпляр IsString
для компиляции кода?