Types 需要和不可能拥有某种类型的签名
我已经定义了2个签名和4个模块,如下所示,它运行良好: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
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)
。如果您有更多函数,请将它们添加到矩阵
中,并在矩阵三角
中定义它们。我遵循了您的方法,仍然有一个错误,请您看一下好吗?