SML中函子结构的扩展与多重归属

SML中函子结构的扩展与多重归属,sml,functor,ml,ascription,Sml,Functor,Ml,Ascription,在标准ML中,是否有任何方法可以使函子输出的结构具有传入结构的所有功能以及任何新功能 以类似的方式,是否可以进行多重归属?在上述情况下,它将立即有用,因为您可以将函子的输出归因于原始结构的签名和另一个指定新功能的签名 我理解这样做的含义,以及为什么这可能是个坏主意。目前,我刚刚在functor输出中保留了传入结构的一个副本,但这意味着您有一长串“Foo.Bar.func”来访问基本功能 谢谢您可以使用open将结构的内容带入当前范围。如果在另一个结构(或函子)中使用,它将执行我认为您想要的操作

在标准ML中,是否有任何方法可以使函子输出的结构具有传入结构的所有功能以及任何新功能

以类似的方式,是否可以进行多重归属?在上述情况下,它将立即有用,因为您可以将函子的输出归因于原始结构的签名和另一个指定新功能的签名

我理解这样做的含义,以及为什么这可能是个坏主意。目前,我刚刚在functor输出中保留了传入结构的一个副本,但这意味着您有一长串“Foo.Bar.func”来访问基本功能


谢谢

您可以使用
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"; *)

非常感谢!这肯定回答了我关于函子的问题。你知道做多重归属吗?比如说我想为“测试”签名。有没有办法在不将“测试”的内容复制到新签名的情况下做到这一点?非常感谢!这肯定回答了我关于函子的问题。你知道做多重归属吗?比如说我想为“测试”签名。在不将“测试”的内容复制到新签名的情况下,有没有办法做到这一点?