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
存在。
不幸的是,由於這段代碼構成了解析器的一部分,因此隱藏較新版本的字節串會破壞解析器本身的依賴關係(parsec),並隱藏較舊的版本會產生相同的錯誤。有沒有其他解決方法? –
@MikeMenzel使用公共版本的字符串重新安裝這兩個軟件包。例如,'cabal install --reinstall parsec yourotherpackage'。 –
@丹尼爾瓦格納那就是訣竅。謝謝。 –