OCaml — конструктор несвязанных типов

Я новичок в OCaml и не понимаю систему модулей в Ocaml.

module type Queue = 
sig 
  type element
  type queue
  val enq: queue * element -> queue
end

module StringQ : Queue with type element = string =                                                                                                                          
struct                                                                                                                                                                       
  type element = string         (* If I remove this it also doesn't work *)                                                                                                                                                  
  type queue = element list                                                                                                                                                  
  exception EMPTY_Q                                                                                                                                                          
  let emptyq = []                                                                                                                                                            

  let enq: queue * element -> queue =                                                                                                                                        
    fun arg ->                                                                                                                                                               
      let (q, elem) = arg in                                                                                                                                                 
        elem @ [q]                                                                                                                                                           

  let rec deq: queue -> element * queue =                                                                                                                                    
    fun q ->                                                                                                                                                                 
      match q with                                                                                                                                                           
      | [] -> raise EMPTY_Q                                                                                                                                                  
      | x :: xs -> (x, xs)                                                                                                                                                   

end                                

Я получаю ошибку компиляции: This expression has type element list, but an expression was expected of type 'a list

А пока буду признателен за любые ссылки о модулях в Ocaml.


person zeronone    schedule 06.12.2013    source источник
comment
Тип проверяет отлично здесь. Больше информации?   -  person gsg    schedule 06.12.2013
comment
Я обновил полный код   -  person zeronone    schedule 06.12.2013
comment
Несколько побочных моментов: fun arg -> let (q, elem) = arg in ... может быть просто fun (q, elem) -> .... Что еще более важно, @ имеет время выполнения, линейное по длине левого аргумента, поэтому ваше enq не является постоянным временем (как я полагаю, вы хотели бы, чтобы это было).   -  person gsg    schedule 06.12.2013


Ответы (1)


Просто измените

elem @ [q]

to

q @ [elem]

У меня компилируется (OCaml 4.00.1).

(На самом деле вы не выглядите запутанным, этот код учит меня кое-чему о модулях.)

person Jeffrey Scofield    schedule 06.12.2013