2014-09-20 2 views
4

Я смущен различиями между haskell и python клиентами для msgpack. Это:msgpack: haskell & python

import Data.MessagePack as MP 
import Data.ByteString.Lazy as BL 

BL.writeFile "test_haskell" $ MP.pack (0, 2, 28,()) 

и это:

import msgpack 

with open("test_python", "w") as f: 
    f.write(msgpack.packb([0, 2, 28, []])) 

дают мне различные файлы:

$ diff test_haskell test_python 
Binary files test_haskell and test_python differ 

Может кто-нибудь объяснить, что я делаю неправильно? Может, я неправильно понял что-то около ByteString?

+0

ли msgpack заботиться о списках против кортежей? В haskell вы используете кортеж (последний элемент которого является единицей aka '()'), а в python вы используете список (последний элемент которого - '[]', пустой список). Попробуйте [используя кортежи python] (http://www.tutorialspoint.com/python/python_tuples.htm). – rampion

+0

@rampion Результат python '' packb'' с кортежами такой же, как и для списков. – erthalion

ответ

9

Пустой кортеж () в Haskell не похож на пустые кортежи или пустой список в Python. Он похож на None в Python. (в контексте msgpack).

Таким образом, чтобы получить тот же результат, изменить программу Haskell, как:

MP.pack (0, 2, 28, []) -- empty list 

Или изменить программу питона, как:

f.write(msgpack.packb([0, 2, 28, None])) 

See a demo.

+2

Большое спасибо, особенно за демо! – erthalion