参考涉及签名中的仿函数结果的类型

时间:2016-09-27 04:00:46

标签: sml polyml

如何引用结构中使用的签名中的类型,该结构从仿函数的结果派生类型。以下是使用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

2 个答案:

答案 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