Hello everyone. I’m a beginner in Ocaml and recently I ran into a problem when I was doing the “Sorting a List of Lists According to Length of Sublists” exercise on the official website.
Below is my current code:
let frequency_sort (lst : 'a list list) : 'a list list =
let aux (lst : 'a list list) : (int * 'a list) list =
let sizes = List.map List.length lst in
let frequency lst =
List.map (fun x -> List.filter (fun y -> y = x) lst |> List.length) lst
in
List.combine (frequency sizes) lst
in
List.sort (fun a b -> Int.compare (fst a) (fst b)) (aux lst)
|> List.map (fun lst -> snd lst)
The code runs as expected, But when I want to explicitly annotate the frequency
as 'a list -> int list
:
let frequency_sort (lst : 'a list list) : 'a list list =
let aux (lst : 'a list list) : (int * 'a list) list =
let sizes = List.map List.length lst in
let frequency (lst: 'a list) : int list =
List.map (fun x -> List.filter (fun y -> y = x) lst |> List.length) lst
in
List.combine (frequency sizes) lst
in
List.sort (fun a b -> Int.compare (fst a) (fst b)) (aux lst)
|> List.map (fun lst -> snd lst)
The function frequency_sort
is now inferred as int list list -> int list list
:
Can anyone explain to me why this happens? And how to make frequency_sort
polymorphic again when I explicitly annotated the frequency
?