Types 在ReasonML中打印用户定义的类型

Types 在ReasonML中打印用户定义的类型,types,ocaml,reason,Types,Ocaml,Reason,有没有一种简单的方法可以在ReasonML中通用地打印用户定义的类型或嵌套列表 背景:我正在为一门入门CS课程I TA的学生编写检查预期程序,今年我们首次使用Reason。当check expect失败时,我希望打印出预期的和实际的输出,但是如果不提前知道参数的类型,尤其是嵌套列表和用户定义的类型,我就无法想出如何有效地打印出结果 我目前的解决方法是:我根据所采用的类型编写了不同的check expect过程(例如,CheckExpectListList,它映射到每个嵌套列表并递归地打印参数)

有没有一种简单的方法可以在ReasonML中通用地打印用户定义的类型或嵌套列表

背景:我正在为一门入门CS课程I TA的学生编写检查预期程序,今年我们首次使用Reason。当check expect失败时,我希望打印出预期的和实际的输出,但是如果不提前知道参数的类型,尤其是嵌套列表和用户定义的类型,我就无法想出如何有效地打印出结果

我目前的解决方法是:我根据所采用的类型编写了不同的check expect过程(例如,CheckExpectListList,它映射到每个嵌套列表并递归地打印参数)

潜在帮助:Sketch.sh能够计算和打印函数调用的结果,即使使用用户定义的类型。是否有人知道他们是如何做到这一点的/我如何在自己的支票打印中使用该功能的


谢谢

需要记住的一点是,由于类型擦除,没有足够的信息在运行时用编译后的代码漂亮地打印任何用户定义的类型。最多可以打印内存表示形式。通过一些巧妙的技巧,您可以尝试将此内存表示映射到预定义的类型。然而,这听起来可能会给你的学生带来令人发狂的错误信息

因此,在评估之前,您需要保留有关学生代码的更多信息

一种方法是使用顶级会话,就像Sketch所做的那样。由于Repl可以访问类型定义,因此它可以使用此信息漂亮地打印任何用户定义的类型。最简单的设置方法是启动OCaml Repl进程,并使用它来评估和打印学生代码。更复杂的可能性是直接使用OCaml的编译器库,但最终会产生更多的控制。然后必须初始化REPL会话,添加一些流量重定向。完成后,您可以逐段评估学生代码,查看环境中的现有值


另一种正交方法是解析学生代码,并为每个类型定义添加漂亮的打印机。这可以使用ppx基础设施来完成。例如,您可以编写一个自定义ppx,为每个类型定义添加一个派生注释。您还可以查找正在测试的函数,并向函数添加一些指令。

您是编译为JavaScript还是本机?我相信sketch.sh使用了编译器附带的一些顶级API,但我认为还取决于是否能够动态编译或评估代码,因为这些信息在编译期间可用,但在编译后的代码中不可用。您还可以使用PPX(编译器扩展名),但对于学生来说,这些设置和使用可能并不那么直接。例如