模块的继承及其类型

Sof*_*mur 4 inheritance ocaml types module

我已经定义了2个签名和2个模块,如下所示.一个签名来自另一个; 一个模块来自另一个模块.

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
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,它最终会给我一个错误Error: This expression has type 'a array array but an expression was expected of type 'a t = 'a MatrixArray.t.

有谁知道如何保持这种继承并使类型'a t = 'a array array被识别?

Tho*_*mas 5

在代码中:

module MatrixArray : MATRIX = struct
  type 'a t = 'a array array
 ...
end
Run Code Online (Sandbox Code Playgroud)

你强制MatrixArray隐藏的定义'a t.解决问题的一种方法是删除签名约束:

module MatrixArray = struct
  type 'a t = 'a array array
 ...
end
Run Code Online (Sandbox Code Playgroud)

您可以在以后替换MatrixArray(MatrixArray : MATRIX)的时候要抽象类型t.

  • 当然,因为如果你编写`include(MatrixArray:MATRIX)`,那么你仍然抽象类型`t`.在这种情况下,当你调用`Array.make`函数时,你不希望`t`是抽象的.所以在这种情况下,只需保留`include MatrixArray`.如果你真的想保持`t` abstract,那么你需要在`MATRIX`中导出一个构造函数(适用于任何类型的`t`)并在`init`中调用该抽象构造函数. (2认同)