【发布时间】:2012-01-30 00:12:14
【问题描述】:
我已经定义了 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
TRIANGLE 和 MATRIX 是两个并行签名。函数unionXXXX 采用两个直角三角形,如果它们的边长相同,则构建一个矩阵。
模块XXXXArray内部由array of array实现,模块XXXXList内部由list of list实现。但是它们可以具有相同的签名XXXX,其中包括set、get...等功能。
这种设计的问题在于,TRIANGLE中的set、get等函数,4个unionXXXX函数可以有相同的实现。我们只需要一个函数union,它的类型实际上是: 'a TRIANGLE.t -> 'a TRIANGLE.t -> 'a MATRIX.t。
但如果我将签名MATRIX 定义如下,编译器会在union 的签名处停止并给出Error: Unbound module Triangle:
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 更好,但是很遗憾我们不能指定它的类型,因为缺少 'a TRIANGLE.t,要么在签名MATRIX 或模块中的MatrixXXXX。
我希望我的需求和顾虑已被清楚地描述,有没有人有解决方案或更好的设计?
Edit1 :按照评论的建议更改字母的大小写...
【问题讨论】:
标签: types module ocaml signature