Важно помнить, что из-за стирания типов недостаточно информации, чтобы красиво печатать любые пользовательские типы во время выполнения с помощью скомпилированного кода. В лучшем случае вы можете распечатать представление памяти. С помощью некоторых хитрых приемов вы можете попытаться отобразить это представление в памяти на ваш предопределенный тип. Тем не менее, это звучит так, как будто это может привести к совершенно безумному сообщению об ошибке для ваших учеников.
Таким образом, вам нужно хранить больше информации о кодах ваших учеников до оценки.
Один из способов сделать это -используйте сеанс верхнего уровня, как это делает Sketch. Поскольку Repl имеет доступ к определениям типов, он может использовать эту информацию для печати любых пользовательских типов. Самый простой способ настройки - запустить процесс OCaml Repl и использовать его для проверки и печати кода ученика. Немного более сложная возможность, но в конечном итоге обеспечивающая больший контроль, заключалась бы в непосредственном использовании библиотеки компиляторов OCaml. Затем вы должны инициализировать сеанс REPL, добавить некоторые перенаправления потока. Как только это будет сделано, вы можете оценивать код вашего студента фразу за фразой, просматривая существующие значения в среде ...
Другой ортогональный способ - это проанализировать код вашего студента и добавить pretty-printer к определениям каждого типа. ,Это можно сделать с помощью инфраструктуры ppx. Например, вы можете написать собственный ppx, который добавляет производную аннотацию к определениям каждого типа. Вы также можете искать тестируемую функцию и добавлять к ней некоторые инструменты.