我正在编写一个函数来从列表中删除具有相同值的邻居。我不明白这里的语法错误。这就是我所拥有的:
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]
答案 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
,_
作为“匹配任何内容”的匹配语法。