我在下面的代码中遇到类型问题(一些简单的模块功能图实现)。似乎这些类型生活在自己的生活中。
我在模块Edge中实现了type t = NotaEdge | Edge of int*v*v
,模块Graph中的这种类型变为type edge = E.t
。对我来说一切似乎都很好,除了事实上我无法在其上进行模式匹配,因为构造函数Edge在模块Graph中仍未定义。
当我尝试与Edge(l,n,m)匹配时,函数是否成功:#Error:Unbound constructor Edge
希望有人可以很好地展示它,先生:)
module Vertex : Vertex with type label = int =
struct
type t = NotaNode | Node of int
type label = int
exception No of string
...
module Edge : Edge with type label = int and type v = Vertex.t =
struct
type v = Vertex.t
type t = NotaEdge | Edge of int*v*v
type label = int
exception No of string
...
module Graph (E : Edge) (V : Vertex) : Graph with type vertex = V.t and type edge = E.t =
struct
type vertex = V.t
type edge = E.t
type t = E.t list* V.t list
let empty = ([],[])
let rec suc (x:edge list) (v1:vertex) =
match x with
y::ys -> (match y with
(*Error-->*) Edge(l,n,m) -> if n == v1 then m::(suc ys v1) else suc ys v1
| _ -> [])
|[] -> []
let succ (t1:t) (v1:vertex) =
match t1 with
(x,_) -> suc x v1
...
答案 0 :(得分:5)
这里的事情有点乱; Error
永远不会定义,我认为是一些错别字。如果你提供编译的代码会更有帮助。把它压低,但在语法上是正确的。我只能对有限的信息和常见的陷阱进行推测。
了解Vertex
和Edge
如果在签名Edge
中,类型t
的定义与您提供的Edge
的实施方式相同,那么您可以将变体与E.Edge
匹配, E.NotaEdge
。如果类型t
是抽象的(签名中的唯一信息是type t
),那么您将不会(并且合理地不应该)以这种方式访问实现或模式匹配。在这种情况下,实现隐藏在签名后面。在处理仿函数时,这通常很好(并且打算),因为您可以以任何必要和方便的方式实现模块。