2015-10-30 2 views
1

У меня есть проект, над которым я работаю, и мне нужно реализовать функцию гистограммы в OCaml. Я должен написать функцию, которая принимает список в качестве аргумента и возвращает гистограмму в виде списка кортежей. Это выглядело бы примерно так: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)] ******* 

Мне нужно перезвонить histo, где находятся ******. Любая помощь вообще будет действительно оценена.

ответ

0

Это довольно ясно школьное задание, поэтому я просто дам несколько советов.

  • Вы, кажется, ожидать изменения nl в вашей histo функции. Но переменные OCaml неизменяемы. Переменная с именем nl в вашем коде всегда будет связана с пустым списком. Это, как правило, первое, что нужно выяснить в FP: как работать с неизменяемыми значениями.

  • Как подсказка, сущность заключается в передаче значений, таких как nl, как параметров вашей функции. Параметры функции могут (разумеется) отличаться при разных вызовах функции.

  • Я не следую вашему коду, если x появляется в nl (check возвращает true). В этом случае вам нужно создать список с увеличенным счетчиком. Но ваш код просто продолжается, не делая ничего особенного.

  • Если вы переопределяете histo, чтобы принять все необходимые параметры, ваш незавершенный случай просто должен позвонить histo с правильными параметрами.

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