我正在进行一个项目,我需要在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)] *******
我需要重新调用他所在的地方。任何帮助都将非常感激。
答案 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