我想创建一个基于另一个可以切换其实现的结构的结构。
signature Field =
sig
type field_type;
val zero : field_type;
val add : (field_type * field_type) -> field_type;
val f : int -> field_type;
end;
structure Reals :> Field =
struct
type field_type = real;
val zero = 0.0;
fun add (x,y) = x + y;
fun f x = Real.fromInt(x);
end;
structure Rat :> Field =
struct
type field_type = int * int;
val zero = (0, 1);
fun add ((i1,i2),(j1,j2)) = (i1*j2 + j1*i2, i2*j2);
fun f x = (x, 1);
end;
functor Useable(F : Field) =
struct
type field_type = F.field_type;
val zero = F.zero;
fun add(x,y) = F.add(x,y);
fun f x = F.f x;
end;
structure ReF = Useable(Reals);
structure RaF = Useable(Rat);
这个想法是我可以插入 Field 的实现(Reals 或 Rat,忽略低效的实现)。
我可以运行此代码 ReF.add(ReF.zero, ReF,zero)
,但无法运行ReF.add(0.0, 0.0)
(或RaF.add((0,1),(0,1))
)
为了克服这个问题,我创建了一个构造函数f: int -> field_types
,但我发现这不是那么优雅而且很麻烦。我可以为能够使用做任何事情ReF.add(0.0, 0.0)
吗?