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”