我正在使用OCaml开发一个项目,并且我对数组有一些问题,我不确定。我不被允许使用List模块,所以请给我一些关于我的作品的想法或建议。
首先,我已经实现了一个名为'a list -> 'a list
的函数uniq
,它返回数组中uniq元素的列表,例如uniq [5;6;5;4] => [6;5;4]
这是我的实施:
let rec uniq x =
let rec uniq_help l n =
match l with
[] -> []
| h :: t -> uniq_help t, n if (n = h) else (h :: (uniq_help(t, n)))
match x with
[] -> []
| h::t -> uniq_help t, h
;;
我确信这是一个正确的实施,有人可以给我一些建议或正确吗?
答案 0 :(得分:8)
由于各种原因,您的函数在语法上是不正确的:
uniq_help
需要两个元素,因此您必须使用uniq_help t n
调用它,而不是uniq_help(t, n)
等。if/else
表达式的格式应为if cond then expr1 else expr2
。uniq_help
本地使用uniq
,您需要in
个关键字。修复语法错误后,您的函数如下所示:
let rec uniq x =
let rec uniq_help l n =
match l with
| [] -> []
| h :: t -> if n = h then uniq_help t n else h::(uniq_help t n) in
match x with
| [] -> []
| h::t -> uniq_help t h
但是,为了确保列表中的每个元素都是唯一的,您必须检查其所有元素的唯一性。一个快速解决方案可能是:
let rec uniq x =
(* uniq_help is the same as above *)
match x with
| [] -> []
| h::t -> h::(uniq_help (uniq t) h)