Haskell: как добавить патч?

Я просматриваю главу IO книги Learn You a Haskell и заметил несоответствие в том, как строки байтов отображаются для меня по сравнению со снимками экрана в книге (пример см. ниже). Если у людей нет других предложений, кажется, что решение (по крайней мере, согласно this post) заключается в установке этот патч.

Вероятно, это довольно простой вопрос, но... как мне установить этот тип патча?

Я, конечно, открыт и для других предложений: как заставить ghci отображать правильный формат ByteString.


Моя установка/система:

  • ghci 7.6.3 (устанавливается через платформу Haskell)
  • Xubuntu 14 (виртуальная коробка)

Как ByteStrings отображаются в книге. (Примечание: можно предположить, что автор загрузил скрипт, содержащий следующие import qualified Data.ByteString.Lazy as B.)

ghci> B.cons 85 $ B.pack [80,81,82,84]
Chunk "U" (Chunk "PQRT" Empty)

Как ByteStrings отображаются на моем компьютере:

Prelude> import qualified Data.ByteString.Lazy as B
Prelude B> B.cons 85 $ B.pack [80,81,82,84]
"UPQRT"

person iceman    schedule 14.10.2014    source источник
comment
Этот патч был для того, чтобы показать, как он перешел от производного экземпляра Show к рукописному экземпляру. По сути, версия, используемая LYAH, старше той, которую вы используете, и та, которую вы используете, верна. Новое поведение заключается в том, чтобы распечатать строку байтов, как если бы это была обычная строка, а не как базовые конструкторы данных. Вероятно, это соответствует расширению OverloadedStrings, благодаря которому ByteString могут быть записаны как литералы String.   -  person bheklilr    schedule 15.10.2014
comment
Ох, ладно. Хорошо, есть ли способ увидеть конкретные Chunk, созданные компилятором для конкретной Lazy ByteString?   -  person iceman    schedule 15.10.2014
comment
Кроме того, не могли бы вы сделать свой пост ответом? :)   -  person iceman    schedule 15.10.2014
comment
@buckling по версии, используемой LYAH, я полагаю, вы имеете в виду версию GHCI, верно?   -  person Code-Apprentice    schedule 15.10.2014


Ответы (1)


Патч, на который вы ссылаетесь, показывает разницу между старой и новой версией bytestring, где более новая версия использует написанный от руки экземпляр Show. Вы не должны устанавливать его, просто LYAH нуждается в нескольких обновлениях здесь и там (разработка Haskell за последние несколько лет продвинулась довольно быстро).

Конструкторы ByteString фактически стали закрытыми, вы не можете использовать их напрямую. Из-за этого экземпляр Show должен выводить String, который можно превратить обратно в ByteString, и проще всего использовать расширение pack или OverloadedStrings.

В Data.ByteString.Lazy есть функция toChunks, но я не уверен, что она делает именно то, что вам нужно. По сути, вы должны рассматривать реализацию ByteString как закрытую и использовать только экспортированные библиотечные функции, чтобы ничего не сломать. Это было бы равносильно желанию увидеть внутренности Data.Map.Map, просто с этим было бы некрасиво работать.

person bheklilr    schedule 14.10.2014