Types 需要和不可能拥有某种类型的签名

Types 需要和不可能拥有某种类型的签名,types,module,ocaml,signature,Types,Module,Ocaml,Signature,我已经定义了2个签名和4个模块,如下所示,它运行良好: module type TRIANGLE = sig type 'a t val get ... val set ... ... end module type MATRIX = sig type 'a t val unionArrayArray: 'a TriangleArray.t -> 'a TriangleArray.t -> 'a t val uni

我已经定义了2个签名和4个模块,如下所示,它运行良好:

module type TRIANGLE =
  sig
    type 'a t
    val get ...
    val set ...
    ...
  end

module type MATRIX =
  sig
    type 'a t
    val unionArrayArray: 'a TriangleArray.t -> 'a TriangleArray.t -> 'a t
    val unionListList: 'a TriangleList.t -> 'a TriangleList.t -> 'a t
    val unionArrayList: 'a TriangleArray.t -> 'a TriangleList.t -> 'a t
    val unionListArray: 'a TriangleList.t -> 'a TriangleArray.t -> 'a t
    ...
  end

module rec MatrixArray: MATRIX =
  struct
    type 'a t = 'a array array
    ...
  end

and MatrixList: MATRIX =
  struct
    type 'a t = 'a list list
    ...
  end

and TriangleArray: TRIANGLE =
  struct
    type 'a t = 'a array array
    ...
  end

and TriangleList: TRIANGLE =
  struct
    type 'a t = 'a list list
    ...
  end
三角形
矩阵
是两个并行签名。函数
unionXXXX
取两个直角三角形,如果它们的边长度相同,则构建一个矩阵

模块
XXXXArray
由数组数组内部实现,模块
XXXXList
由列表内部实现。但是它们可以具有相同的签名
XXXX
,其中包括
set
get

此设计的问题是,对于
三角形
set
get
等函数,4个
unionXXXX
函数可以有相同的实现。我们只需要一个函数
union
,它的类型实际上是
:'a TRIANGLE.t->'a TRIANGLE.t->'a MATRIX.t

但是,如果我按如下方式定义签名
矩阵
,编译器将在
联合
的签名处停止,并给出一个
错误:未绑定模块三角形

module type TRIANGLE =
  sig
    type 'a t
    val get ...
    val set ...
    ...
  end

module type MATRIX =
  sig
    type 'a t
    val union: 'a TRIANGLE.t -> 'a TRIANGLE.t -> 'a t
    ...
  end
我希望我已经展示了将4个
unionXXXX
函数组合成一个
union
,但是很遗憾,我们不能指定它的类型,因为在签名
矩阵
或模块
MatrixXXXX
中缺少一个三角形.t

我希望我的需求和关注已经被清楚地描述,有人有解决方案或更好的设计吗


Edit1:根据注释建议更改字母的大小写…

首先,一个关于约定的词:通常期望模块名称具有
CamelCase
格式,模块类型名称具有
全大写格式。我花了两次时间才注意到您处理的是模块类型而不是模块

因此,您想说的是,任何实现模块类型
矩阵的模块都应该能够,对于任何实现
三角形
的模块
三角形
,提供以下签名:

type 'a t
val union : 'a Triangle.t -> 'a Triangle.t -> 'a t
像这样表达通用量词是不可能的。您应该使用存在量词和函子:

module type MATRIX = sig
  module Triangle : TRIANGLE 
  type 'a t 
  val union : 'a Triangle.t -> 'a Triangle.t -> 'a t
end

module MatrixOfTriangle = functor (Triangle:TRIANGLE) -> struct
  module Triangle = Triangle
  type 'a t = ...
  let union t1 t2 = ...
end

这确实会迫使您指定在代码的任何给定点上处理的三角形,但您可以使用带有
triangle
参数的函子来避免使用一种类型的三角形

感谢您的评论,我想
模块类型MatrixOfTriangle
应该是
模块MatrixOfTriangle
?“但是您可以使用带三角形参数的函子来避免解决一种类型的三角形。”==>这是什么意思?似乎我们无法编写
模块M=MatrixOfTriangle(TRIANGLE)
实际上,我还有其他函数,例如
split:'a Matrix.t->'a TRIANGLE.t*'a TRIANGLE
。这就是我递归定义
MatrixXXXX
trianglexxx
的原因。如果我遵循您的方法,那么最好在
三角形中添加
模块矩阵:矩阵
。你知道怎么做吗?我已经发布了这个问题,您需要定义一个实现
Triangle
Triangle
模块,并编写
模块M=MatrixOfTriangle(Triangle)
。如果您有更多函数,请将它们添加到
矩阵
中,并在
矩阵三角
中定义它们。我遵循了您的方法,仍然有一个错误,请您看一下好吗?