2013-02-02 20 views
24

OverloadedStrings kullanarak ByteString10 kodlu bir kod yazmıştım. Bu kod, base16-bytestring tarafından sağlanan işlevleri kullanarak kodladığı hex kodlu Dize değişmezlerinden oluşturuyor. Bu iyi çalıştı, ama düşündüğüm kadar iyi anlamadım.Haskell ithalatının yan etkileri var mı?

Tamamen kafamı karıştıran şey bu. Neden

{-# LANGUAGE OverloadedStrings #-} 

import Data.ByteString.Base16() 
import qualified Data.ByteString as B 

plaintext = "The message" :: B.ByteString 

main = print plaintext 

derleme yapar ve Tamam çalıştırmak ama Data.ByteString.Base16 için ithalat kaldırırsanız o zaman (benzer this question kadar) derlenmeyecektir:

test.hs:6:13: 
No instance for (Data.String.IsString B.ByteString) 
    arising from the literal `"The message"' 

Haskell Wiki göre, böyle bir ithalat olduğunu "yalnızca tiplerin ve yalnızca başka bir şeylerin içe aktarılması için kullanışlıdır", ancak görebildiğim kadarıyla, base16-bytestring kaynak kodu, sadece encode ve decode fonksiyonlarını herhangi bir yazım hatası örneği tanımlamaz.

İthalat, kodun derlenmesi için gerekli olan IsString örneğini nasıl sağlıyor?

cevap

32

Haskell'de, yazım örnekleri her zaman dışa aktarılır ve içe aktarılır - bunları gizleyemezsiniz. Bu genellikle "açık dünya varsayımı" olarak adlandırılır.

Bu, typeclass örneklerinin de geçici olarak dışa aktarıldığı anlamına gelir: örneğin bir kitaplığı içe aktarırsanız, modülünüzden de dışa aktarılır.

Bu durumda, IsString örneği Data.ByteString.Char8 örneğindedir, Data.ByteString.Base16 tarafından alınır.

import Data.ByteString.Char8() 

eğer ilgilenirsen, açık dünya varsayımı üzerine bazı bilgiler veren güzel SO question vardır: Sen ile ithalat yerine mümkün olmalıdır.

İlgili konular