模块:在仿函数中输入问题

时间:2011-05-17 13:43:41

标签: types functional-programming ocaml

我在下面的代码中遇到类型问题(一些简单的模块功能图实现)。似乎这些类型生活在自己的生活中。

我在模块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

...

1 个答案:

答案 0 :(得分:5)

这里的事情有点乱; Error永远不会定义,我认为是一些错别字。如果你提供编译的代码会更有帮助。把它压低,但在语法上是正确的。我只能对有限的信息和常见的陷阱进行推测。

了解VertexEdge

的签名非常非常

如果在签名Edge中,类型t的定义与您提供的Edge的实施方式相同,那么您可以将变体与E.Edge匹配, E.NotaEdge。如果类型t是抽象的(签名中的唯一信息是type t),那么您将不会(并且合理地不应该)以这种方式访问​​实现或模式匹配。在这种情况下,实现隐藏在签名后面。在处理仿函数时,这通常很好(并且打算),因为您可以以任何必要和方便的方式实现模块。