在OCaml顶层打印多态容器

7
假设我有自己的数据结构,以一个愚蠢的例子为例:type 'a mylist = Empty | Cons of 'a * ('a mylist)。我希望toplevel以{a,b,...}的形式打印这个列表。这里的ab是类型为'a的内容,根据在toplevel中使用#install_printer安装的打印函数进行打印。如果没有可用的打印函数,则打印为<abstr>
我知道如何为单态mylist定义打印函数,但是否有一种多态的方法告诉toplevel只需放置{,},并对介于其中的任何类型使用它已知的内容?

我不认为这是可能的,但这是一个很好的问题。我很想学习其他方面的知识。 - Jeffrey Scofield
1个回答

1
我认为这是不可能的。原因是OCaml在运行时丢弃了类型,因此无法有一个函数在运行时根据类型表现出不同的行为。因此,您无法定义这样的多态打印函数。请注意,#install_printer不是OCaml语言的一部分,而是针对toplevel的指令,它仍然知道类型。唯一可能的解决方案是定义一个通用的打印函数,该函数将'a打印函数作为参数。类似于:
'a -> string ->  'a mylist -> unit

但我想你已经知道了,不是吗?

实际上,我没有这样做。这听起来好像可以解决实际问题,不是吗?相关的类型都在它们自己的模块中,比如M.t,并且有一个类型为M.t -> string的函数M.print。(而M是M1、M2等)。那么我需要制作一个Mylist(M)函子,使其生成一个参数化为M的M.t mylist,并从M.print中派生出自己的打印函数(?)虽然这听起来有点繁琐,但我不确定如何使它在未知类型而不是M.t的情况下回退到<abstr>。 - user3240588
由于似乎没有肯定的答案,所以接受。 - user3240588

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接