2014-02-26 4 views
2

Я пытаюсь реализовать наборы через списки .. Это код с реализацией (я опустил интерфейс):OCaml: тип варианта блок не имеет конструктора ::

module MySet : Set = 
    struct 
    type 'a set = 'a list 
    let empty : 'a set = [] 
    let add (x: 'a) (s: 'a set) : 'a set = 
     if not(List.mem x s) then x::s 
    let remove (x: 'a) (s: 'a set) : 'a set = 
     let rec foo s res = 
    match s with 
    | [] -> List.rev res 
    | y::ys when y = x -> foo ys res 
    | y::ys -> foo ys (y::res) 
     in foo s [] 
    let list_to_set (l: 'a list) : 'a set = 
     let rec foo l res = 
    match l with 
    | [] -> List.rev res 
    | x::xs when member x xs -> foo xs res 
    | x::xs -> foo xs (x::res) 
     in foo l [] 
    let member (x: 'a) (s: 'set) : bool = 
     List.mem x s 
    let elements (s: 'a set) : 'a list = 
     let rec foo s res = 
    match s with 
    | [] -> List.rev res 
    | x::xs -> foo xs (x::res) 
     in foo s [] 
    end;; 

Это ошибка Я получаю

Characters 162-164: 
     if not(List.mem x s) then x::s 
            ^^ 
Error: The variant type unit has no constructor :: 

Я не могу понять ошибку

ответ

5

это очень запутанное сообщение, которое мы получили, так как 4,01, вытекающие из того, что у вас нет другого филиала, и что() является действительным конструктором unit.

Поскольку у вас нет другого филиала весь if должен ввести в unit и, таким образом then ветви Aswell и пытается унифицировать выражение в then ветви со значением типа unit и обнаруживает, что :: не является конструктором значений типа unit.

То, что вы хотели написать это:

if not (List.mem x s) then x :: s else s 

Без else ветви вашей add функции необходимо ввести в 'a -> 'a set -> unit

Сообщение странно ошибка будучи ошибка отслеживаются в системе отслеживания проблем OCaml, см PR 6173.

Смежные вопросы