编码为模块递归的多态递归的类型推断

Type inference for polymorphic recursion encoded as module recursion

标准 ML 没有多态递归。将递归添加到模块语言允许我们恢复多态递归作为一种特殊情况,使用 endofunctors 的不动点。例如:

signature SEQ =
sig
  type 'a seq

  (* operations on sequences *)
end

functor BootstrapSeq (S : SEQ) =
struct
  datatype 'a seq
    = Nil
    | Zero of ('a * 'a) S.seq
    | One of 'a * ('a * 'a) S.seq

  (* operations on sequences *)
end

structure rec Seq = BootstrapSeq (Seq)

众所周知,多态递归使类型推断变得不可判定。但是,函子定义已经包含部分类型信息,即其参数的签名。此信息是否足以使类型推断再次可判定?

是的,因为签名提供了一个"forward declaration"的多态类型,所以不用递归推断。另外,你不需要仿函数,你可以直接写一个递归结构绑定。但这需要签名注释,因此效果相同。