List OCaml列表语法错误
我正在编写一个函数,用于从具有相同值的列表中删除邻居。我不明白这里的语法错误是什么。这就是我所拥有的:List OCaml列表语法错误,list,recursion,ocaml,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
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]
match子句
[()]->[()]
接受并生成一个单元列表
,这在这里没有真正意义。您可能应该编写[\u]->retl
,
作为“匹配任何东西”的匹配语法。匹配子句[()]->[()]
接受并生成一个单元列表
,这在这里没有真正意义。您可能应该编写[\u]->retl
,
作为“匹配任何内容”的匹配语法。如果其中一个测试用例有[()]作为输入,那么您不能在列表的开头使用9000作为假值。您需要有一个与列表中的值类型相同的伪值。一个想法是使用列表的实际第一个值
作为旁白,你似乎应该在比赛中拿出你的第二个案子。对于第二种情况,我指的是(修复代码后)匹配长度为1的列表的模式;i、 例如,模式[\u]
。对于您的方法(使用“最后一次看到”值),只有两种情况,即空列表和非空列表。您的特殊问题出现在列表的开头(正如您现在所经历的),而不是末尾
更新
您可以在任何地方进行模式匹配(匹配表达式)。因此,您可以在中的后面有一个:
let rem_dup_neighbors aList =
let rec aux l lastseen retl =
...
in
match aList with
| pattern1 -> blah blah blah
| pattern2 -> aux blah blah
更新2
当递归地调用自己时,您必须传递一个较小的问题。您的辅助函数只是不断使用相同的列表调用自己。如果其中一个测试用例有[()]作为输入,那么您不能使用9000作为列表开头的假值。您需要有一个与列表中的值类型相同的伪值。一个想法是使用列表的实际第一个值
作为旁白,你似乎应该在比赛中拿出你的第二个案子。对于第二种情况,我指的是(修复代码后)匹配长度为1的列表的模式;i、 例如,模式[\u]
。对于您的方法(使用“最后一次看到”值),只有两种情况,即空列表和非空列表。您的特殊问题出现在列表的开头(正如您现在所经历的),而不是末尾
更新
您可以在任何地方进行模式匹配(匹配
表达式)。因此,您可以在中的后面有一个:
let rem_dup_neighbors aList =
let rec aux l lastseen retl =
...
in
match aList with
| pattern1 -> blah blah blah
| pattern2 -> aux blah blah
更新2
当递归地调用自己时,您必须传递一个较小的问题。您的辅助函数只是不断使用相同的列表调用自己。好的,箭头右侧retl后面的“,”是什么意思?因此我只是删除了[()]->[()]行,并将[]->retl更改为[\u]->retl。但是,函数的一个测试用例将[()]传递给函数,因此我得到了错误:错误:此表达式的类型为unit,但表达式的类型应为int。错误指向测试文件gsg,它表示代码中应该包含[\u]->retl
。然后,他继续指出(逗号后)\uu
是一种匹配任何值的模式。他的标点符号有点混乱,我明白了。谢谢你澄清这一点。如果可能的话,您能解决我在上一篇评论中遇到的新问题吗?此函数将列表元素与9000进行比较,这限制了它只能接受int
s的列表。好的,箭头右侧retl后面的“,”是什么意思?因此我删除了[()]->[()]行,并将[]->retl更改为[]->retl。但是,函数的一个测试用例将[()]传递给函数,因此我得到了错误:错误:此表达式的类型为unit,但表达式的类型应为int。错误指向测试文件gsg,它表示代码中应该包含[\u]->retl
。然后,他继续指出(逗号后)\uu
是一种匹配任何值的模式。他的标点符号有点混乱,我明白了。谢谢你澄清这一点。如果可能的话,您能解决我在前面的评论中遇到的新问题吗?此函数将列表元素与9000进行比较,这将限制它只能接受int
s的列表。第二种情况下,您是指If语句的else部分吗?另外,您知道如何在不使用库函数的情况下访问列表的第一个元素吗?请参阅重写的文本。使用模式匹配来访问列表元素。嗯,我想基本情况下需要它,否则函数会无限地调用自己。基本情况是空列表。我想这就是[\u]->retl。我将[]->retl替换为[]->retl。你是说离开[]->retl并删除[]->retl吗?第二种情况是指if语句的else部分?另外,您知道如何在不使用库函数的情况下访问列表的第一个元素吗?请参阅重写的文本。使用模式匹配来访问列表元素。嗯,我想基本情况下需要它,否则函数会无限地调用自己。基本情况是空列表。我想这就是[\u]->retl。我将[]->retl替换为[]->retl。你的意思是离开[]->retl和删除[\u]->retl?每次更新后的函数都会将相同的列表传递给递归调用rem\u dup\u neighb\u aux
。您希望在每次递归调用时沿着列表进行,因此在那里传递rest