4

我的代码有一个奇怪的问题,我真的不知道如何解决:我的代码如下:

module type tGraphe = sig
    type node
    type arc
    end;;

module One : tGraphe with type node=int and type arc=int = struct
    type noeud=int
    type arc=int
end;;

module Two : tGraphe with type node=int and type arc=Empty|Node of(int*int) = struct
    type node=int
    type arc=Empty|Node of(int*int)
end;;

模块一没有遇到任何问题,但是对于模块二,则表明存在 arc 类型的语法错误。如果有人可以解释我如何使用没有“with”的模块类型,我将不胜感激。已经试过了

module Two : tGraphe= struct
        type node=int
        type arc=Empty|Node of(int*int)
end;;
open Two;;
let z=Empty;;

但它不起作用。

4

2 回答 2

4

当你定义

type foo = int
type bar = Leaf | Node of int * int

之间有一个根本的区别foo,它是已经存在的类型的类型同义词int( ),bar它引入了一个类型,引入了新的构造函数,Leaf并且Node与之前的所有类型都不同。

当你写

module M = struct
  type foo = int
  type bar = Leaf | Node of int * int
end

类型M.foo等于int,但类型M.bar只等于它自己:它是新的并且没有可比较的存在(即使是具有完全相同构造函数的类型也会被认为是不同的和不兼容的)。

在签名中发布以下事实是有意义的M.foo = int,但不是说M.bar = Leaf | ...:M.bar仅等于其自身,M.bar并且签名改进M with type bar = M.bar不会给您任何信息。

您的代码中的问题是您坚持使用对tGraphe使用抽象类型的签名的归属。编写 jrouquie 的代码你什么也得不到

type global_arc = Vide | Node of (int*int)

module Two : tGraphe with type noeud = int and type arc = global_arc = struct
  type noeud = int
  type arc = global_arc
end;;

而不是简单地

module Two = struct
    type noeud = int
    type arc = Vide |Node of(int*int)
end

施工M : S不仅仅是检查。它将主动隐藏输入信息M。那里的结构S with type ... = ...可以让你隐藏得比你要少一点S。但是,如果您根本不想隐藏任何内容,在您的示例中,请不要使用签名归属!就写吧module M = struct ... end

如果你只是: S用来检查你没有错,没有在字段名称和东西上犯任何错误,你可以把它作为一个纯粹的检查:

module Two = struct ... end

let () = ignore (module Two : S) (* only a check! *)

SML 在仅检查兼容性的“透明”模块注释和强制兼容性隐藏类型信息的“不透明”模块注释(通常称为密封)之间有区别。OCaml 只有不透明的密封,所以你必须小心不要过度使用它。

PS:当在 StackOverflow 上提问时,如果你的代码是用英文写的会比用法语写的更好。

于 2013-04-16T11:55:41.190 回答
0

我不确定你想要什么。以下代码有效,但我不知道它是否满足您的需求。

module type tGraphe = sig
  type noeud
  type arc
end;;

type global_arc = Vide | Node of (int*int)

module Two : tGraphe with type noeud = int and type arc = global_arc = struct
  type noeud = int
  type arc = global_arc
end;;

let z: Two.arc = Vide;;
于 2013-04-16T08:41:04.993 回答