2014-09-29 3 views
2

Почему decodeFile от Data.Binary выбросить ошибку *** Exception: demandInput: not enough bytes, при использовании decode и readFile от Data.ByteString.Lazy работает должным образом?Почему decodeFile выбрасывает ошибку «недостаточно байт»?

Минимальный пример

module Testing where 

import Data.Binary 
import qualified Data.Map.Strict as Map 
import qualified Data.ByteString.Lazy as B 

x :: Map.Map Char Int 
x = Map.fromList $ zip ['a'..'d'] [1,2,3,4] 

main :: IO (Map.Map Char Int) 
main = do 
    encodeFile "testing" (encode x) 
    r <- decodeFile "testing" 
    print $ r == x 
    return r 

main2 :: IO (Map.Map Char Int) 
main2 = do 
    B.writeFile "testing2" (encode x) 
    r <- fmap decode $ B.readFile "testing2" 
    print $ r == x 
    return r 

Я нашел это потенциально важный вопрос: Using Data.Binary.decodeFile, encountered error "demandInput: not enough bytes", но это не реально ответить на мой вопрос, поэтому с помощью decodeFile не работает, но readFile делает.

Выход я получаю:

[1 of 1] Compiling Testing   (testing.hs, interpreted)                           
Ok, modules loaded: Testing.                                    
*Testing> main                                       
*** Exception: demandInput: not enough bytes    

*Testing> main2                                       
True                                          
fromList [('a',1),('b',2),('c',3),('d',4)] 

ответ

4

Вы

encodeFile "testing" (encode x) 

, который означает, что вы кодирующая xдважды. Изменение этого значения на

encodeFile "testing" x 

работает должным образом.

 Смежные вопросы

  • Нет связанных вопросов^_^