Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List OCaml列表语法错误_List_Recursion_Ocaml - Fatal编程技术网

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