169 похожих чатов

Допустим, есть структура data X = X {field1 :: T.Text,

field2 :: T.Text} deriving (Show, Generic) deriving Binary

С помощью binary эту структуру можно (де)сериализовывать.
После сериалзации T.Text будет храниться длина строка, а потом её содержимое. Удобно, однако проблема в том, что я работаю со c string. Это набор байт, который заканчивается \NUL (то есть нам не надо знать длину строки, мы должны читать поток байт, пока не наткнёмся на \NUL). Как парсить ту же структуру (X), но так, чтобы каждое поле, которое имеет тип T.Text, (де)сериализовывалсь по-другому? Я попытался что-то сделать с Generic, но быстро встрял (к тому же требуется расширение UndecidableInstances, ещё и BSL.toStrict, который работает за O(n))

Если коротко, то

class MyGBinaryGet f where
mygGet :: Get (f a)

instance MyGBinaryGet (K1 i T.Text) where
mygGet = K1 . decodeUtf8 . BSL.toStrict<$> getLazyByteStringNul

instance Binary c => MyGBinaryGet (K1 i c) where
mygGet = K1 <$> get

То есть decode (BS.pack [49, 50, 51, 0, 51, 50, 49, 0]) :: X == X "123" "321"

2 ответов

20 просмотров
ㅤ-Атеист Автор вопроса

Как ни странно, тут будут overlapping instances, но даже добавление {-# OVERLAPPING #-} не работает. Да и вообще моё решение — большой костыль

Проще всего парсить не Text, а свой newtype в этих полях

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта