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

时间:2016-06-25 08:16:52

标签: recursion polymorphism sml type-inference ml

标准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)

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

1 个答案:

答案 0 :(得分:3)

是的,因为签名提供了一个"前向声明"多态类型,因此不必递归推断。此外,您不需要仿函数,您可以直接编写递归结构绑定。但这需要签名注释,因此相同。