Модули: проблема типа в функторе - PullRequest
3 голосов
/ 17 мая 2011

У меня проблема с типами в следующем коде (некоторая легкая реализация функционального графа модуля). Кажется, что типы живут своей жизнью.

У меня 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

...

1 Ответ

5 голосов
/ 17 мая 2011

Здесь все немного грязно; Error никогда не определяется, и я полагаю, что это несколько опечаток. Было бы гораздо полезнее, если бы вы дали код, который скомпилирован. Par это вниз, но синтаксически правильно. Я могу только строить предположения об ограниченной информации и распространенных ошибках.

Было бы очень полезно узнать подписи Vertex и Edge

Если в подписи Edge тип t определен так же, как и в реализации Edge, которую вы даете, тогда вы можете сопоставить вариант с E.Edge и E.NotaEdge. Если тип t является абстрактным (единственная информация в подписи - type t), то вы не сможете (и не должны разумно) получать доступ к реализации или сопоставлению с образцом таким способом. В этом случае реализация скрыта за подписью. Это обычно хорошо (и предназначено) при работе с функторами, поскольку вы можете реализовать модуль любым необходимым и удобным способом.

...