在OCaml中重写Scheme代码?

时间:2015-11-05 04:14:53

标签: ocaml racket

(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 *)

此代码不对。它遗漏了我坚持的其他陈述。

2 个答案:

答案 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);;