Как переопределить/предоставить пользовательские экземпляры с помощью bs-derived

Используя bs-вывод, я могу вывести, например. show экземпляров с использованием [@deriving show]. Однако неясно, как я буду использовать тот же вывод, но предоставляя собственный экземпляр show для определенного типа данных.

Пример:

[@deriving show]
type bar = |Bar(int);

[@deriving show]
type foo = |Foo(int, bar);

Используя приведенный выше пример, как бы я изменил Bar, чтобы напечатать его целое число, например. шестнадцатеричный?


person Felix    schedule 19.04.2020    source источник
comment
Я думаю, что это слишком сложно для простой реализации BuckleScript, хотя вы можете попробовать использовать @printer, как в ppx_deriving.   -  person glennsl    schedule 19.04.2020
comment
Что вы имеете в виду под простой bucklescript реализацией? Есть ли что-то еще, что я мог бы использовать?   -  person Felix    schedule 19.04.2020
comment
К сожалению, BuckleScript поставляется с собственным упрощенным механизмом получения, но это не то, о чем вы говорите. bs-deriving кажется портом ppx_deriving, поэтому @printer тоже должен работать там. напишу ответ...   -  person glennsl    schedule 19.04.2020


Ответы (1)


Вы должны иметь возможность использовать @printer для определения собственной функции принтера следующим образом:

[@deriving show]
type bar = Bar([@printer fmt => fprintf(fmt, "0x%x")] int);

fprintf – это локально определенная функция, которая принимает формат . , строка формата и ряд значений в виде определяется строкой формата. Для краткости в данном случае мы частично применяем его, чтобы избежать явной передачи значения int. Это эквивалентно (fmt, n) => fprintf(fmt, "0x%x", n).

Строка формата указывает, что число должно быть отформатировано как шестнадцатеричное со строчными буквами (часть %x) и иметь префикс 0x. Таким образом, 31 выведет 0x1f.

person glennsl    schedule 19.04.2020