2013-02-02 5 views
24

少し前にコードを書きましたが、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インスタンスを定義しません。encodedecodeの関数です。

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

答えて

32

Haskellでは、typeclassインスタンスは常にエクスポートおよびインポートされます。非表示にすることはできません。これは通常、「オープンワールドの仮定」と呼ばれます。

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

この場合、IsStringインスタンスはでインポートされたData.ByteString.Char8になります。

import Data.ByteString.Char8() 

もし興味があるなら、オープンワールドの前提に関するいくつかの情報を与える素敵SO questionがあります:あなたがあなたの輸入を置き換えることができるはずです。

関連する問題