如何构建OCaml文件中出现字符频率的映射?

时间:2011-10-04 23:22:50

标签: map ocaml

我想在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 个答案:

答案 0 :(得分:3)

您的错误非常简单且不言自明。 build_freq_map !file有一个函数类型(它返回一个函数)。您使用()(即单位类型)对整个事物进行模式匹配。所以类型不匹配。

看起来你的程序有点不完整,因为它不会输出任何内容或对build_freq_map得到的结果做任何事情。此外,我没有在build_freq_map中看到任何实际构建您想要的“地图”的逻辑。所以你还有很长的路要走。