Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 模:函子中的类型问题_Types_Functional Programming_Ocaml - Fatal编程技术网

Types 模:函子中的类型问题

Types 模:函子中的类型问题,types,functional-programming,ocaml,Types,Functional Programming,Ocaml,我对以下代码中的类型有问题(一些简单的模块函数图实现)。似乎这类人都过着自己的生活 我在模块边中实现了类型t=NotaEdge | int*v*v的边,模块图中的该类型变为类型Edge=E.t。对我来说一切都很好,除了我不能在上面进行模式匹配,因为构造函数的边在模块图中仍然是未定义的 当我尝试与边(l,n,m)匹配时,正好在函数suc中:#错误:未绑定构造函数边 希望有人能很好地展示,thx提前:) …这里有点乱错误从未定义过,我认为是一些打字错误。如果您提供了编译后的代码,这将更有帮助。平

我对以下代码中的类型有问题(一些简单的模块函数图实现)。似乎这类人都过着自己的生活

我在模块边中实现了
类型t=NotaEdge | int*v*v的边
,模块图中的该类型变为
类型Edge=E.t
。对我来说一切都很好,除了我不能在上面进行模式匹配,因为构造函数的边在模块图中仍然是未定义的

当我尝试与边(l,n,m)匹配时,正好在函数suc中:#错误:未绑定构造函数边

希望有人能很好地展示,thx提前:)


这里有点乱<代码>错误从未定义过,我认为是一些打字错误。如果您提供了编译后的代码,这将更有帮助。平息下来,但在语法上是正确的。我只能对有限的信息和常见的陷阱进行猜测

了解
顶点


如果签名
Edge
中定义的类型
t
与您给出的
Edge
实现中定义的类型相同,则您可以将变量与
E.Edge
E.NotaEdge
匹配。如果类型
t
是抽象的(签名中唯一的信息是
type t
),那么您将无法(也不应该)以这种方式访问实现或模式匹配。在这种情况下,实现隐藏在签名后面。在处理函子时,这通常是好的(并且是有意的),因为您可以以任何必要和方便的方式实现模块。

类型t是抽象的(很抱歉,我没有发布签名),我还没有找到任何方法来做我想做的关于抽象的事情,所以正如你所建议的那样,当我在任何地方重新键入确切的类型时,它都工作得很好(可能不是ellegant,但工作得很好)。我将很快结束这个话题(也许在此之前我们会有一些有趣的东西)使用套筒扳手敲打钉子并不是什么优雅的事情,但它是在你们想拧紧一些螺栓的时候。
 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