在函数OCaml中的列表中添加数字

时间:2014-02-06 00:49:13

标签: 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_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)

3 个答案:

答案 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)