Как переопределить / предоставить пользовательские экземпляры с использованием bs-производных - PullRequest
1 голос
/ 19 апреля 2020

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

Пример:

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

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

Как использовать приведенный выше пример, как Я изменяю Бар, чтобы напечатать его целое число, например, шестнадцатеричное?

1 Ответ

1 голос
/ 19 апреля 2020

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

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

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

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

...