简体   繁体   中英

OCaml: the variant type unit has no constructor ::

I'm trying to implement sets through lists.. This is the code with the implementation (I omitted the interface):

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;;

This is the error I get

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

I can't understand the error

It's a very confusing message that we got since 4.01 that stems from the fact that you have no else branch and that () is a valid constructor for unit .

Since you have no else branch the whole if must type to unit and thus the then branch aswell and it tries to unify the expression in the then branch with a value of type unit and detects that :: is not a constructor for values of type unit .

What you wanted to write is:

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

Without an else branch your add function needs to type to 'a -> 'a set -> unit

The strange error message is being bug tracked in OCaml's issue tracker, see PR 6173 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM