OCaml:变体类型单元没有构造函数::

时间:2014-02-26 20:24:36

标签: 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 ::

我无法理解错误

1 个答案:

答案 0 :(得分:6)

这是一个非常令人困惑的消息,我们从4.01开始就是因为你没有其他分支,而且()是unit的有效构造函数。

由于您没有其他分支,因此整个if必须键入unit,因此then分支,并尝试统一then分支中的表达式值unit的值,并检测::不是类型unit的值的构造函数。

你想写的是:

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

如果没有else分支,您的add函数需要输入'a -> 'a set -> unit

在OCaml的问题跟踪器中正在跟踪奇怪的错误消息,请参阅PR 6173