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