SML中函子结构的扩展与多重归属
在标准ML中,是否有任何方法可以使函子输出的结构具有传入结构的所有功能以及任何新功能 以类似的方式,是否可以进行多重归属?在上述情况下,它将立即有用,因为您可以将函子的输出归因于原始结构的签名和另一个指定新功能的签名 我理解这样做的含义,以及为什么这可能是个坏主意。目前,我刚刚在functor输出中保留了传入结构的一个副本,但这意味着您有一长串“Foo.Bar.func”来访问基本功能SML中函子结构的扩展与多重归属,sml,functor,ml,ascription,Sml,Functor,Ml,Ascription,在标准ML中,是否有任何方法可以使函子输出的结构具有传入结构的所有功能以及任何新功能 以类似的方式,是否可以进行多重归属?在上述情况下,它将立即有用,因为您可以将函子的输出归因于原始结构的签名和另一个指定新功能的签名 我理解这样做的含义,以及为什么这可能是个坏主意。目前,我刚刚在functor输出中保留了传入结构的一个副本,但这意味着您有一长串“Foo.Bar.func”来访问基本功能 谢谢您可以使用open将结构的内容带入当前范围。如果在另一个结构(或函子)中使用,它将执行我认为您想要的操作
谢谢您可以使用
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"
);
您可以使用
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"
);
比如说我想为“测试”签名。在不将“测试”的内容复制到新签名的情况下,有没有办法做到这一点
如果我正确理解了您的问题,那么您正在查找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"; *)
比如说我想为“测试”签名。在不将“测试”的内容复制到新签名的情况下,有没有办法做到这一点
如果我正确理解了您的问题,那么您正在查找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"; *)
非常感谢!这肯定回答了我关于函子的问题。你知道做多重归属吗?比如说我想为“测试”签名。有没有办法在不将“测试”的内容复制到新签名的情况下做到这一点?非常感谢!这肯定回答了我关于函子的问题。你知道做多重归属吗?比如说我想为“测试”签名。在不将“测试”的内容复制到新签名的情况下,有没有办法做到这一点?