OCaml列表语法错误

时间:2014-02-16 03:48:46

标签: list recursion ocaml

我正在编写一个函数来从列表中删除具有相同值的邻居。我不明白这里的语法错误。这就是我所拥有的:

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with 
 []->retl
|[()]->[()]
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux l lastseen retl else rem_dup_neighb_aux l y (y::retl)
in rem_dup_neighb_aux l 9000 [];;

我在函数的最后一行收到以下错误:

Error: This expression has type int but an expression was expected of type
     unit

例如,如果你将[1; 2; 2; 3; 5]传递给函数,它应该返回[1; 2; 3; 5]

感谢任何帮助。感谢

更新: 函数似乎是无限循环:

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with []->retl
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux l lastseen retl else rem_dup_neighb_aux l y (y::retl)
in
    match l with
    (lastseen::rest) ->  rem_dup_neighb_aux l lastseen []

更新2: 没有减少每次迭代的问题。函数似乎现在返回[5; 3; 2]而不是[1; 2; 3; 5]。

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with []->retl
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux rest lastseen retl else rem_dup_neighb_aux rest y (y::retl)
in
    match l with
    []->[]
    |(lastseen::rest) ->  rem_dup_neighb_aux l lastseen []

更新3:

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with []->retl
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux rest lastseen retl else rem_dup_neighb_aux rest y (y::retl)
in
    match l with
    []->[]
    |(lastseen::rest) ->  rem_dup_neighb_aux l lastseen [lastseen]

2 个答案:

答案 0 :(得分:3)

如果其中一个测试用例有[()]作为输入,那么您不能将9000用作列表开头的伪值。您需要具有与列表中的任何类型相同类型的伪值。一个想法是使用列表的实际第一个值。

作为旁注,似乎你应该在比赛中拿出你的第二个案例。在第二种情况下,我的意思是(在修复代码之后)与长度为1的列表匹配的模式;即,模式[_]。使用您的方法(使用“上次看到的”值),只有两种情况,对于空列表和非空列表。你的特殊问题出现在清单的开头(正如你现在所经历的那样),而不是最后的问题。

<强>更新

您可以随时随地进行模式匹配(match表达式)。因此,您可以在in之后添加一个:

let rem_dup_neighbors aList =
    let rec aux l lastseen retl =
        ...
    in
    match aList with
    | pattern1 -> blah blah blah
    | pattern2 -> aux blah blah

更新2

在递归调用自己的时候,你必须传递一个小问题。你的辅助功能只是用同一个列表调用自己。

答案 1 :(得分:2)

匹配条款[()] -> [()]接受并生成unit list,这在那里确实没有意义。您可能应该编写[_] -> retl_作为“匹配任何内容”的匹配语法。