少し前に、16進エンコードされた文字列リテラルからsOverloadedStrings
を作成するために使用するコードをいくつか作成しました。これは、によって提供される関数を使用してデコードします。これは問題なく動作しましたが、思ったほど理解できなかったようです。ByteString
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バイト文字列のソースコードは型クラスインスタンスを定義せず、encode
とdecode
関数のみを定義します。 。
IsString
インポートは、コードをコンパイルするために必要なインスタンスをどのように提供しますか?