标准 ML 中是否有任何方法可以使函子输出一个结构,该结构具有传入结构的所有功能以及任何新功能。
以类似的方式,是否可以进行多重归属?在上述情况下,它将立即有用,因为您可以将函子的输出归因于原始结构的签名和指定新功能的另一个签名。
我理解做这样的事情的含义,以及为什么它可能是一个坏主意。目前,我只是在函子输出中保留了传入结构的副本——但这意味着您有一个长链“Foo.Bar.func”来访问基本功能。
谢谢
标准 ML 中是否有任何方法可以使函子输出一个结构,该结构具有传入结构的所有功能以及任何新功能。
以类似的方式,是否可以进行多重归属?在上述情况下,它将立即有用,因为您可以将函子的输出归因于原始结构的签名和指定新功能的另一个签名。
我理解做这样的事情的含义,以及为什么它可能是一个坏主意。目前,我只是在函子输出中保留了传入结构的副本——但这意味着您有一个长链“Foo.Bar.func”来访问基本功能。
谢谢
假设我想为“TestUp”签名。有没有办法在不将“TEST”的内容复制到新签名中的情况下做到这一点?
如果我正确理解了您的问题,那么您正在寻找include
关键字,该关键字将包含先前签名的定义到新的签名中,从而使用先前的定义扩展签名。
signature TEST_EXT =
sig
include TEST
val beep1 : meep -> unit
end
functor TestUp_EXT(T : TEST) : TEST_EXT =
struct
open T
fun localFun s = beep (10, s)
val beep1 = localFun
end
structure Test2_EXT = TestUp_EXT (Test);
Test2_EXT.beep (5, "EXT: Hi");
Test2_EXT.beep1 "Hi";
print (Int.toString (Test2.rand ()) ^ "\n");
(* This will fail as the signature doesn't define this function,
however as seen the function can easily be used within the functor as
expected *)
(* Test2_EXT.localFun "Hi"; *)
您可以使用open
将结构的内容带入当前范围。如果在另一个结构(或函子)中使用,它会做我认为你想要的。
可以在这里看到一个例子:
signature TEST =
sig
type meep;
val beep : int * meep -> unit;
end;
structure Test : TEST =
struct
type meep = string
fun beep (0, _) = ()
| beep (n, s) = (print (s^"\n"); beep (n-1, s));
end;
functor TestUp (T : TEST) =
struct
open T
fun rand () = 4
end;
structure Test2 = TestUp (Test);
Test.beep (5, "Hello");
Test2.beep (5, "Hi");
print (
Int.toString (Test2.rand ()) ^ "\n"
);