OCaml - 实现直方图功能

时间:2015-10-30 14:39:11

标签: recursion ocaml histogram

我正在进行一个项目,我需要在OCaml中实现直方图功能。我必须编写一个函数,它以列表作为参数,并以元组列表的形式返回直方图。它看起来像这样:

histogram [1;2;3;1;1;3];;
[(1,3);(2,1);(3,2)]
但是,我不能让它发挥作用。我觉得我很接近,但我只需要一些关于如何完成实际直方图功能的帮助/指导。到目前为止,我已经检查了列表(nl)中可能已存在的任何内容。如果它不包含该号码,我将其添加到列表中。我的问题是,一旦我将它添加到列表中,我就不知道如何调用该函数。请参阅我的代码,了解问题所在。

let check a ls = match (a,ls) with
|a,[] -> false
|a,xs -> if fst (hd xs) != a then check a (tl xs) else true


let rec count a ls = match ls with
|[] -> 0
|x::xs -> if x = a then 1 + count a xs else 0 + count a xs

let nl = []    

let rec histo l = match l with
|[]-> []
|x::xs -> if check x nl then histo xs else nl @ [(x,count x l)] *******

我需要重新调用他所在的地方。任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:0)

这显然是一项学校作业,所以我只是给出一些提示。

  • 您似乎希望修改nl功能中的histo。但OCaml变量是不可变的。代码中名为nl的变量将始终绑定到空列表。这通常是FP中首先要弄清楚的:如何使用不可变值。

  • 作为提示,其实质是将nl之类的值作为函数的参数传递。函数的参数可以(当然)在对函数的不同调用中有所不同。

  • x nl中出现check时,我不会关注您的代码(histo返回true)。在这种情况下,您需要创建一个递增计数的列表。但是你的代码只是继续而没有做任何特别的事情。

  • 如果您重新定义histo以获取所有必需参数,则未完成的案例只需使用正确的参数调用mylist = [[1,2,3,4],[5,6,7]] mylist [[1,2,3,4],[5,6,7]]

答案 1 :(得分:0)

toastedDeli,关于你的功能计数的一点建议。您可以使用更多模式匹配:

let rec count a ls = match ls with
  |[]              -> 0
  |x::xs  when x=a -> 1 + count a xs
  |_::xs           -> count a xs

let rec count a = function
  |[]              -> 0
  |x::xs  when x=a -> 1 + count a xs
  |_::xs           -> count a xs