2010-07-25 17 views
7

Uygulamamda, rasgele veri türü içeren bir vektörü serileştirmem gerekiyor, bu durumda Çiftler listesi. Vektör serileştirmek için Data.Vector.Binary ithal ediyorum.Data.Vector.Binary çakışıyor İkili [a] örneği

Overlapping instances for Binary [Double] 
    arising from a use of `decode' at Statistics.hs:57:33-42 
Matching instances: 
    instance (Data.Vector.Generic.Base.Vector v a, Binary a) => 
      Binary (v a) 
    -- Defined in Data.Vector.Binary 
    instance (Binary a) => Binary [a] -- Defined in Data.Binary 

liste Vector örneği var mı:

aşağıdaki hata ortaya çıkar GHCi modülü yüklerken? Belgeleri inceledim, ancak bu örneği bulamadım.

Bu yapıyı serileştirebilmek için neler yapabilirim?

Düzenleme:

aşağıdaki paket sürümlerini kullanıyorum:

  • vektör 0.6.0.2
  • vektör ikili-örnekleri-0.1.2
  • ikili-0.5.0.2

Ayrıca, bu sefer bir chars listesiyle sorunu gösteren bir snippet:

import Data.Binary 
import Data.Vector.Binary 
import qualified Data.ByteString.Lazy as L 

main = L.writeFile "/tmp/aaa" $ encode "hello" 
+1

İkili ve Vector'ün hangi sürümlerini kullandığınızı bildirir misiniz? –

+0

GHCi'nin listelerin vektörler olduğu varsayılıyormuş gibi kabul ediyorum. Vektör ikili örneklerin kaynak kodunu inceledim ve bulunamadı. –

+1

Açık değil. Edward Kmett, bu konuyu uzun zaman önce http://stackoverflow.com/questions/3213490/how-do-i-write-if-typeclass-a-then-a-is-also-an-instance-of-b adresinde açıkladı. -Bu-this-definiti –

cevap

7

Tamam, ben burada sorunu görüyorum. vektör ikili-örnekleri paket tanımlar: çok kötü

instance (Data.Vector.Generic.Base.Vector v a, Binary a) => Binary (v a) 

. Bu tanım, "her türlü" v "için anlamındadır, bu geçerli bir ikili örnektir". Bu, v a ile eşleşen herhangi bir tür için kullanılabilir olduğu anlamına gelir. Bu, tüm listeleri, tüm functor'ları ve tüm monad'ları içerir (ancak bunlarla sınırlı değildir).

Prelude Data.Binary Data.Vector.Binary Data.ByteString.Lazy> :t getChar 
getChar :: IO Char 
Prelude Data.Binary Data.Vector.Binary Data.ByteString.Lazy> encode getChar 
<interactive>:1:0: 
    No instance for (Data.Vector.Generic.Base.Vector IO Char) 
     arising from a use of `encode' at <interactive>:1:0-13 
    Possible fix: 
     add an instance declaration for 
     (Data.Vector.Generic.Base.Vector IO Char) 
    In the expression: encode getChar 
    In the definition of `it': it = encode getChar 
İşte

tercüman ki yanlış olan getChar :: IO Char için bu örneği kullanmaya çalışıyor: Bir gösteri ve GHCi aşağıdakileri bildirir.

Kısa yanıt: Şu anda vektör ikili örnekleri kullanmayın. Bu örnek bozulur ve örneklerin Haskell koduyla nasıl yayıldığı göz önüne alındığında sorunlara neden olur. Bu düzeltilinceye kadar, vektörler için kendi ikili örneklerinizi yazmalısınız. Benim bu Data.Vector.Generic.Vector bir örneğidir herhangi Vector çalışacaklarına inanıyoruz bir monomorfik vektör tipi

instance (Binary a) => Binary (Vector a) where 

için vektör ikili-örnekleri kodu kopyalayıp kısıtlamak gerekir.

Ayrıca, bu ikili ikili örnekleyici ile iletişim kurmak isteyebilirsiniz.

+0

Açıklama için çok teşekkür ederim, ayrıca Edward Kmett'in cevabının bağlantısı, bunun neden olduğunu anlamada yardımcı oldu. Ona atıfta bulunarak: 'Bir çok açıdan' örnek 've' sınıf 'tanımlarının sözdizimi geriye doğrudur.Minnettar olduğum önerilerinizi takip edeceğim. – uu1101

+0

Rica ederim; Yardım aldığına sevindim. –

+0

Paket güncellendi. Kutulu ve kutulu olmayan vektör vakalarını şimdi ayrı ayrı numaralandırıyorum (sadece 'Vector a' kullanamazsınız, sadece kutulu olanlar). –