我已经定义了2个签名和2个模块,如下所示.一个签名来自另一个;一个模块来自另一个模块. module type MATRIX =sig type 'a t ...endmodule type AMATRIX = sig include MATRIX ...endmodule MatrixArray : MATRIX =struct
module type MATRIX = sig type 'a t ... end module type AMATRIX = sig include MATRIX ... end module MatrixArray : MATRIX = struct type 'a t = 'a array array ... end module AMatrixArray : AMATRIX = struct include MatrixArray let init (x: 'a) : 'a t = Array.make 2 (Array.make 2 x) ... end
但是当我编译它时,它最终给了我一个错误错误:这个表达式有一个类型’一个数组数组但是表达式是’a t =’a MatrixArray.t.
有谁知道如何保持这种继承并使类型’a t =’数组数组被识别?
实际上,MatrixArray不仅仅是一个MATRIX:它是一个MATRIX,其中类型t的实现已知是一个数组.所以你可以写:module MatrixArray : MATRIX with type 'a t = 'a array array = struct type 'a t = 'a array array ... end
这样,您可以保留MATRIX约束并检测类型错误,并保留有关类型实际的信息 – 当然,假设您关心的是将类型设为public而不是abstract.