可选参数的本地抽象类型和默认值

时间:2018-04-04 09:04:19

标签: ocaml gadt locally-abstract-type

我正在为具有两种可能的内部格式的矩阵类型编写接口。这是一个简化版本:

type csc (* compressed-sparse-column format *)
type csr (* compressed-sparse-row format *)

type _ fmt =
| CSC : csc fmt
| CSR : csr fmt

type 's matrix = { sparsetype : 's fmt }

let newmat (type s) ?(fmt : s fmt = CSC) () = { sparsetype = fmt }

这不起作用,因为默认值CSC不是s fmt类型。

似乎这个想法没有工作的机会,因为无法为签名中的类型变量指定默认值,即签名

val newmat : ?(fmt:'s sformat) -> unit -> 's matrix
如果没有明确指定's = csc

会以某种方式指定fmt

有没有解决这个限制的方法?

期望OCaml接受这样的定义是不合理的吗?

1 个答案:

答案 0 :(得分:3)

想要这个并不是没有道理的(我自己多次想要它),但OCaml并不接受它,并且有充分的理由。它的 很难在存在的情况下与推理相结合 高阶函数。

所以,我担心你必须坚持使用非可选参数,或者说 几个功能。