2016-11-10 1 views
1

Hy, 히스토그램을 만들려고하는데 오류가 계속 발생합니다.List.filter using error OCaml

Histogram example: 
input :[2;1;2;3;2;1;2;2;5] 
output :[(2,5);(1,2);(3,1);(5,1)] 

내 코드 :

let rec count a ls = match ls with 
    |[]    -> 0 
    |x::xs when x=a -> 1 + count a xs 
    |_::xs   -> count a xs 
let rec histo l = match l with 
|[] -> [] 
|x :: xs -> [(x, count x l)] @ List.filter(fun x -> xs != x)histo xs;; 

오류 : 이 기능은 입력이 ('A -> 부울을 ->)'목록 -> '그것은 너무 많은 인수에 적용되는 목록; 어쩌면 당신은`; '을 잊었을 것입니다. 당신은 거의 끝 부분에있는

+1

'List.filter (재미 X -!> XS = X) (히스 XS)' – beoliver

답변

1

) 일부 힌트 :

  • (일부 코드에서 누락) 괄호주의해야합니다.
  • 필터가 올바르지 않습니다. histop이 튜플 목록을 반환하기 때문에 (fun (t, _) -> not (t = x)).
0
let rec count a = function 
    |[] -> 0 
    |x::xs -> if x=a then 1 + count a xs else count a xs 

let rec histo = function 
    |[] -> []  
    |x::xs -> let l'=List.filter ((<>)x) xs in 
      [(x, 1+count x xs)] @ histo l' 
;; 

테스트

# histo [2;1;2;3;2;1;2;2;5];; 
- : (int * int) list = [(2, 5); (1, 2); (3, 1); (5, 1)] 

또는

let rec histo = function 
    |[] -> [] 
    |x::xs -> let l'=List.filter ((<>)x) xs in 
      [(x, 1+List.length xs - List.length l')] @ histo l' 
;;