少し前にコードを書きましたが、OverloadedStrings
を使用して、base16-bytestring
で提供される関数を使用してデコードする16進数の文字列リテラルからByteString
を作成します。これはうまくいきましたが、私は思ったようにそれを理解していないようです。Haskellのインポートには副作用がありますか?
私は完全に混乱しているものはこれです。なぜ
{-# LANGUAGE OverloadedStrings #-}
import Data.ByteString.Base16()
import qualified Data.ByteString as B
plaintext = "The message" :: B.ByteString
main = print plaintext
コンパイルを行い、[OK]を実行しますが、私はData.ByteString.Base16
のインポートを削除した場合、それは(this questionに似て)コンパイルに失敗します。
test.hs:6:13:
No instance for (Data.String.IsString B.ByteString)
arising from the literal `"The message"'
Haskell Wikiによると、このようなインポートがあります"typeclassesのインスタンスだけをインポートするだけで便利ですが"私が見るところでは、base16のバイトコードのソースコードはtypeclassインスタンスを定義しません。encode
とdecode
の関数です。
コードをコンパイルするためにインポートによって、IsString
の必要なインスタンスがどのように提供されますか?