如何引用结构中使用的签名中的类型,该结构从仿函数的结果派生类型。以下是使用poly解释器的示例:
> signature Res = sig type f end;
signature Res = sig type f end
> functor F (A: sig type t end) : Res = struct datatype f = None | Some end;
functor F (A: sig type t end): Res
> structure S = struct local structure A = F(struct type t = int end) in type t = A.f list end end;
structure S: sig type t = A.f list end
首先,我不明白为什么当A.f出现在结构本地时,会出现在结果签名中。其次,如何创建与此结构S匹配的签名?
这样的事情不起作用:
signature SSig = sig type t = F(struct type t = int end).t list end
此外,如果类型f是int而不是数据类型,不知何故S最终会意识到f是一个int而不是被签名隐藏。即使使用不透明签名并不显示int,这似乎也不合理。
> functor F (A: sig type t end) : Res = struct type f = int end;
functor F (A: sig type t end): Res
> structure S = struct local structure A = F(struct type t = int end) in type t = A.f list end end;
structure S: sig type t = int list end
> functor F(A: sig type t end):> Res = struct type f = int end;
functor F (A: sig type t end): Res
> structure S = struct local structure A = F(struct type t = int end) in type t = A.f list end end;
structure S: sig type t = A.f list end
答案 0 :(得分:2)
我对你的第一个问题没有答案,只是一个猜测,所以我不会对此发表评论。 Andreas Rossberg可能会澄清那里的事情:)
关于你的第二个问题。我不明白你为什么要在签名中实例化一个仿函数。也许你想要这个?
signature Res =
sig
type f
end
signature SSig =
sig
structure R : Res
type t = R.f list
end
然后,任何实现SSig
的人都可以自由地将调用F
的结果分配给R
子结构。
关于你的最后一点。除非您不透明地实现签名,否则不会隐藏类型。
答案 1 :(得分:1)
[...]为什么A.f在结构本地时出现在结果签名中。
这似乎是Poly / ML的神器。 https://jsoup.org/似乎没有泄漏这个名字:
Moscow ML version 2.10
Enter `quit();' to quit.
- signature Res = sig type f end;
> signature Res = /\f.{type f = f}
- functor F (A: sig type t end) : Res =
struct
datatype f = None | Some
end;
> functor F : !t.{type t = t}->?=f.{type f = f}
- structure S =
struct
local structure A = F(struct type t = int end)
in type t = A.f list
end
end;
> New type names: =f
structure S : {type t = f list}
如何引用结构中使用的签名中的类型,该结构从仿函数的结果中派生出类型?
(评论)问题是我不想在SSig中使类型t不透明,但我也不想在签名中包含R因为我不想要消费者可以访问它。我可以用不透明的类型f = R.f做类似的事情,但是我必须在签名中包含它并再次使签名变得混乱。
Drup最近对Moscow ML的回答讨论了单模态模块输入类型的缺点。
当所有R包含的类型为t时,是不是“在SSig中变得不透明”和“在SSig的签名中不包括R”等价? Res可能包含的内容多于类型t,在这种情况下,您可以提供structure R : sig type t end
。或者也许这种Ionuţ答案的变化是可取的:
signature Res =
sig
type t (* rather than structure R *)
type f = t list
end
functor F (A : sig type t end) : Res =
struct
type t = A.t
type f = t list
end
structure S = F(struct type t = int end)
我不确定如何避免重复type f = t list
。