Algorithm 将数字添加到函数OCaml中的列表中

Algorithm 将数字添加到函数OCaml中的列表中,algorithm,ocaml,ml,Algorithm,Ocaml,Ml,这就是我所拥有的,我所犯的错误是 Error: This function has type 'a * 'a list -> 'a list It is applied to too many arguments; maybe you forgot a `;'. 为什么会这样?我计划将两个列表传递给deleteDuplicates函数,一个排序列表和一个空列表,并希望在列表r中删除重复项,一旦原始列表达到[]条件,就会返回重复项 将返回更新的代码 let myfunc_c

这就是我所拥有的,我所犯的错误是

Error: This function has type 'a * 'a list -> 'a list
       It is applied to too many arguments; maybe you forgot a `;'. 
为什么会这样?我计划将两个列表传递给deleteDuplicates函数,一个排序列表和一个空列表,并希望在列表r中删除重复项,一旦原始列表达到
[]
条件,就会返回重复项

将返回更新的代码

let myfunc_caml_way arg0 arg1 = ...

rather than

let myfunc_java_way(arg0, arg1) = ...

Then you can call your function in this way:

myfunc_caml_way "10" 123

rather than

myfunc_java_way("10, 123)

您似乎认为OCaml使用元组(a,b)来表示函数调用的参数。事实并非如此。当一些表达式彼此相邻时,这就是函数调用。第一个表达式是函数,其余的表达式是函数的参数

所以,这两条线:

append(first,r)
deleteDuplicates(remaining, r)
用三个参数表示函数调用。该函数是
追加
。第一个参数是
(first,r)
。第二个参数是
deleteDuplicates
。第三个参数是
(剩余,r)

因为
append
只有一个参数(一个元组),所以传递给它的参数太多了。这就是编译器告诉你的

您似乎还认为
append(first,r)
将更改
r
的值。事实并非如此。OCaml中的变量是不可变的。您不能执行任何更改
r
值的操作

更新

我认为你有太多的问题,所以在这一点上,你可以有效地帮助你。您可以尝试阅读一些OCaml教程。对于您看到的每一个错误,它都比在这里问问题快得多:-)

尽管如此,以下是“比赛失败”的含义。这意味着在某个地方有一个
匹配
应用于表达式,但是
匹配
的模式都与表达式不匹配。您的
deleteDuplicates
代码显然存在模式覆盖率错误;i、 例如,它的模式并不涵盖所有情况。第一次匹配仅适用于空列表或包含2个或更多元素的列表。它不适用于1个元素的列表。

这不是对您问题的直接回答

定义“n元”函数的标准方法是

let myfunc_caml_way arg0 arg1 = ...
而不是

let myfunc_java_way(arg0, arg1) = ...
myfunc_java_way("10, 123)
然后可以通过以下方式调用函数:

myfunc_caml_way "10" 123
而不是

let myfunc_java_way(arg0, arg1) = ...
myfunc_java_way("10, 123)
请参见此处的示例:

通过从
myfunc\u java\u方式
切换到
myfunc\u caml\u方式
,您将受益于所谓的“套用”

但是请注意,有时需要用括号括起整个调用

myfunc_caml_way (otherfunc_caml_way "foo" "bar") 123
为了告诉编译器不要将代码解释为

((myfunc_caml_way otherfunc_caml_way "foo") "bar" 123)

我不知道这有多有用,但这里有一些代码可以满足您的需要,以相当标准的OCaml风格编写。花些时间确保你了解它是如何工作的以及为什么工作的。也许你应该从更简单的事情开始(例如,如何对整数列表中的元素求和?)。实际上,您应该从OCaml教程开始,仔细阅读并确保理解代码示例


使用append(first,r)我不希望更改r的值,而是希望添加到r。那么我该如何处理我的处境呢?所以本质上O'Caml中的每一行都必须是递归的,也就是在if语句的代码中,我必须只有一个调用?添加到r会改变r的值,不是吗?基本上,您希望将OCaml代码视为调用函数,然后将返回的值传递给其他函数。为了更清楚,您可以使用
let
let newr=append(first,r)在deleteDuplicates(remaining,newr)
中为中间值命名。我的最终目标是创建一个新列表,以便添加到其中。如果列表是不可变的,那么如何添加到列表中?我想append可以完成这项工作:(使用cons获取第一个和第二个元素,比较它们,如果相同,则将其添加到darn列表(当然是新的);答案与之前相同:您不向现有列表中添加,而是创建一个更长的新列表。虽然它只适用于较小的数字,但对于较大的数字,我发现了一个例外:匹配失败(“//toplevel//”,405,0)。此外,为什么要使用“in”