我正在尝试通过列表实现集合..这是带有实现的代码(我省略了接口):
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 ::
我无法理解错误
答案 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。