标准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)
众所周知,多态递归使得类型推断不可判定。但是,仿函数定义已经包含部分类型信息,即其参数的签名。这些信息是否足以使类型推断再次可判定?
答案 0 :(得分:3)
是的,因为签名提供了一个"前向声明"多态类型,因此不必递归推断。此外,您不需要仿函数,您可以直接编写递归结构绑定。但这需要签名注释,因此相同。