这就是我所拥有的以及我遗憾的错误
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)
答案 0 :(得分:1)
我不知道这可能有多大用处,但是这里有一些代码可以做你想要的,用相当标准的OCaml风格编写。花一些时间确保您了解它的工作原理和原因。也许你应该从更简单的东西开始(例如你如何总结整数列表的元素?)。 实际上,您应该从OCaml教程开始,仔细阅读并确保您理解代码示例。
let deleteDuplicates u =
(*
u : the sorted list
v : the result so far
last : the last element we read from u
*)
let rec aux u v last =
match u with
[] -> v
| x::xs when x = last -> aux xs v last
| x::xs -> aux u (x::v) x
in
(* the first element is a special case *)
match u with
[] -> []
| x::xs -> List.rev (aux xs [x] x)
答案 1 :(得分:0)
您似乎在想OCaml使用元组(a,b)来表示函数调用的参数。事实并非如此。每当某些表达式彼此相邻时,这就是函数调用。第一个表达式是函数,其余表达式是函数的参数。
所以,这两行:
append(first,r)
deleteDuplicates(remaining, r)
用三个参数表示函数调用。该函数是append
。第一个参数是(first ,r)
。第二个参数是deleteDuplicates
。第三个参数是(remaining, r)
。
由于append
只有一个参数(一个元组),所以你传递的参数太多了。这就是编译器告诉你的。
您似乎也认为append(first, r)
会更改r
的值。不是这种情况。 OCaml中的变量是不可变的。你不能做任何会改变r
的价值的事情。
<强>更新强>
我认为你有太多问题可以帮助你有效地帮助你。您可以尝试阅读一些OCaml教程。对于你看到的每一个错误,这里要问一个问题要快得多: - )
尽管如此,这就是“匹配失败”的含义。这意味着你有一个match
你正在应用于表达式,但match
的所有模式都不匹配表达式。您的deleteDuplicates
代码明显存在模式覆盖错误;即,它的图案不包括所有情况。您的第一个匹配仅适用于空列表或2个或更多元素的列表。它不适用于1个元素的列表。
答案 2 :(得分:0)
这不是您问题的直接答案。
定义“ n -ary”函数的标准方法是
let myfunc_caml_way arg0 arg1 = ...
而不是
let myfunc_java_way(arg0, arg1) = ...
然后你可以用这种方式调用你的函数:
myfunc_caml_way "10" 123
而不是
myfunc_java_way("10, 123)
请参见此处的示例:
从myfunc_java_way
切换到myfunc_caml_way
,您将受益于所谓的“Currying”
但请注意,有时您需要用括号括起整个调用
myfunc_caml_way (otherfunc_caml_way "foo" "bar") 123
为了告诉编译器不要将您的代码解释为
((myfunc_caml_way otherfunc_caml_way "foo") "bar" 123)