1

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

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不是 type s fmt

看来这个想法是没有机会了,因为无法在签名中指定类型变量的默认值,也就是签名

val newmat : ?(fmt:'s sformat) -> unit -> 's matrix

会以某种方式需要指定's = csc何时fmt未明确指定。

有没有办法绕过这个限制?

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

4

1 回答 1

3

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

所以,恐怕你将不得不坚持使用非可选参数,或者制作几个函数。

于 2018-04-04T09:40:31.483 回答