24

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

IsStringインポートは、コードをコンパイルするために必要なインスタンスをどのように提供しますか?

4

1 に答える 1

33

Haskellでは、型クラスインスタンスは常にエクスポートおよびインポートされます。非表示にすることはできません。これは通常、「開世界仮説」と呼ばれます。

これは、型クラスインスタンスも推移的にエクスポートされることを意味します。インスタンスを含むライブラリをインポートすると、モジュールからもエクスポートされます。

この場合、IsStringインスタンスはにData.ByteString.Char8あり、はによってインポートされData.ByteString.Base16ます。インポートを次のように置き換えることができるはずです。

import Data.ByteString.Char8 ()

興味があれば、開世界仮説に関するいくつかの情報を提供する素晴らしいSOの質問があります。

于 2013-02-02T21:32:47.397 に答える