У меня проблема с типами в следующем коде (некоторая легкая реализация функционального графа модуля). Кажется, что типы живут своей жизнью.
У меня type t = NotaEdge | Edge of int*v*v
реализовано в модуле Edge, этот тип в модуле Graph становится type edge = E.t
. Мне кажется, что все в порядке, за исключением того факта, что я не могу сопоставить шаблон с ним, потому что конструктор Edge все еще не определен в модуле Graph.
Точно в функции suc, когда я пытаюсь найти соответствие с 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
...