Как построить карту частоты, с которой символы встречаются в файле в OCaml? - PullRequest
1 голос
/ 05 октября 2011

Я хотел бы создать функцию в OCaml, которая возвращает карту того, как часто каждый символ встречается в файле.Например, рассмотрим файл, содержащий это:

AAAAA BB C

Этот вход будет производить эту карту:

{ ' ' -> 2, 'A' -> 5, 'B' -> 2, 'C' -> 1 }

Вот что у меня есть:

let usage = "usage: " ^ Sys.argv.(0) ^ " [OPTION]... [FILE]..."
let file = ref ""
let speclist = [
  ("-z", Arg.String (fun c -> file := c), " compress [FILE]");
  ("-d", Arg.String (fun d -> file := d), " decompress [FILE]");
]

let build_freq_map f =
  let channel = open_in f in
  function x ->
    input_byte channel

let () =
  Arg.parse
    speclist
    (fun x -> raise (Arg.Bad ("Bad argument: " ^ x)))
    usage;

  build_freq_map !file;

Но это не компилируется, говоря:

File "main.ml", line 19, characters 1-22:
Error: This expression has type 'a -> int
       but an expression was expected of type unit

Как бы я изменил свой код так, чтобы build_frequency_map возвращал карту символов и частот файла?

1 Ответ

3 голосов
/ 05 октября 2011

Ваша ошибка довольно проста и не требует пояснений.build_freq_map !file имеет тип функции (возвращает функцию).Вы соответствуете этому образцу с (), то есть типом единицы.Таким образом, типы не совпадают.

Похоже, что ваша программа является неполной, потому что она ничего не выводит или ничего не делает с результатом, полученным из build_freq_map.Кроме того, я не вижу никакой логики в build_freq_map, которая фактически строит вашу «карту», ​​которую вы хотите.Таким образом, у вас еще есть пути.

...