2014-03-06 63 views
1

我试图实现自己的列表模块如下:OCaml的 - 反向列表

type 'a my_list = 
    | Item of ('a * 'a my_list) 
    | Empty 

我已经实现的一些功能,我现在想创建一个列表倒车功能为我的模块这将是这样的:

let rec rev = function 
    | Empty    -> (*return reversed list*) 
    | Item(i, remnant) -> (*recursive call to rev*) 

而且,我不应该使用列表操作,如“::”,“[]”和“@”。

编辑,我的尝试:

let rec rev_append l1 l2 = match l1 with 
    | Empty    -> l2 
    | Item(i, remnant) -> rev_append remnant Item(i, l2) 

let rev l = rev_append l Empty;; 

但这不工作,没有在传递给递归调用的第二个参数的错误:“项目(一,二级)”的错误是“构造函数Item需要1个参数,但在这里应用于0个参数“。

+0

没有使用'::'构造列表的技巧吗?似乎这对列表的定义至关重要。 –

+0

我编辑了我的帖子,向你展示了我的尝试。 – Kernael

回答

1

括号男!

let rec rev_append l1 l2 = match l1 with 
    | Empty    -> l2 
    | Item(i, remnant) -> rev_append remnant (Item (i, l2)) 

编译器了解,rev_append传递以上三个参数即remnantItem(i, l2)

+0

工作过,谢谢。 – Kernael