2012-09-12 41 views
1

所以我有一个列表,我试图将它分成两个列表,这样所有来自原始列表的偶数索引组成第一个列表,而奇数索引组成第二个列表。这里是我的解决方案的尝试,但它不是正确返回:在OCaml中分开一个列表

let rec separate xs = 
    match xs with 
    [] -> [],[] 
    | x::y::xs -> x::separate xs, y::separate xs 
    | x::[] -> x:: separate [], separate [];; 
+0

“...它没有正确地返回” - 这个代码甚至没有编译,因为'独立的'需要键入''一个列表 - >'一个列表*'一个列表',但你正在尝试'x ::分开xs'。这是你的意思吗? –

回答

6

的问题是,separate返回两个名单,而当你写x::separate xs你假设它返回一个列表(要在前面加上x)。 另外,在x::[]的情况下,您已经知道结果,不需要递归调用separate

其中产量:

let rec separate xs = 
    match xs with 
    | x::y::tail -> 
     let a,b = separate tail in 
     x::a, y::b 
    | x::[] -> [x],[] 
    | [] -> [],[];; 

(如果您发布更多的问题,请发表您的上几行,而不只是一个代码,并与压痕)。