2014-02-26 44 views
0

我試圖從Data.Encoding上使用一個解碼器,但我不確定它是否被正確編碼。當我嘗試下面的代碼加載到哈斯克爾:令人費解的數據。編碼錯誤

import Data.Encoding (DynEncoding,decodeLazyByteStringExplicit,encodingFromStringExplicit) 
{- ...more imports ... -} 
import qualified Data.ByteString.Lazy as B (ByteString,takeWhile) 

{- ... more code ... -} 
decodeMyString :: Encoding enc => B.ByteString -> enc -> Either String String 
decodeMyString str decoder = case (decodeLazyByteStringExplicit decoder str) of 
    Left s -> Left $ show s 
    Right decoded -> Right decoder 

我得到以下錯誤:

Couldn't match expected type `bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString' 
      with actual type `B.ByteString' 
In the second argument of `decodeLazyByteStringExplicit', namely 
    `str' 
In the expression: (decodeLazyByteStringExplicit decoder str) 
In the expression: 
    case (decodeLazyByteStringExplicit decoder str) of { 
    Left s -> Left $ show s 
    Right decoded -> Right decoded } 

任何人都可以解釋,爲什麼?我有最新版本的庫bytestring(10.4)和encoding(0.7)。但它應該沒有關係,因爲encoding's hackage page沒有指定所需的bytestring版本。

在這一點上,我幾乎想寫我自己的一套解碼器爲bytestrings非Unicode編碼的,將它們轉換爲UTF-任何字節串,並使用Data.Text.Encoding但我不應該給的Data.Encoding存在。

回答

1

當兩個不同的包與同一個庫的不同版本(本例中是ByteString)組裝時,這是一個常見問題。解決方案是here

+0

不幸的是,由於這段代碼構成了解析器的一部分,因此隱藏較新版本的字節串會破壞解析器本身的依賴關係(parsec),並隱藏較舊的版本會產生相同的錯誤。有沒有其他解決方法? –

+2

@MikeMenzel使用公共版本的字符串重新安裝這兩個軟件包。例如,'cabal install --reinstall parsec yourotherpackage'。 –

+0

@丹尼爾瓦格納那就是訣竅。謝謝。 –