(define unique
(lambda (L)
(cond ((null? L) L)
((null? (cdr L)) L)
((eqv? (car L) (car (cdr L))) (unique (cdr L)))
(else (cons (car L) (unique (cdr L))))))
以上代码(#racket语言)从列表中查找唯一元素。我想将这个球拍代码翻译成OCaml。 到目前为止,我已经
了let rec unique func lis =
match lis with
| [] -> []
| (h::lis') -> if lis = []
then x (* There is only one item in the list which was captured by head and the tail is null *)
此代码不对。它遗漏了我坚持的其他陈述。
答案 0 :(得分:2)
查看方案代码有四种情况。
((null? L) L)
,与你的OCaml代码中的| [] -> []
非常吻合。
((null? (cdr L)) L)
检查列表是否只有一个元素,其OCaml代码为| [x] -> [x]
如果它有两个或更多元素,则检查第一个和第二个元素是否相同。
如果是,答案是(unique (cdr L))
;
如果不是,那就是(cons (car L) (unique (cdr L)))
。
您可以使用模式匹配来获取前两个元素,如:| first::second::rest -> if ...
答案 1 :(得分:0)
在OCaml翻译你的算法给了我:
let rec unique l = match l with
| [] -> []
| [x] -> [x]
| x :: y :: tl -> if x = y then y :: unique tl else x :: unique ( y :: tl);;