将文件解析为 OCaml 中的哈希表

Parsing file into Hashtable in OCaml

我正在尝试学习函数式编程,但很难用函数式方式表达文件解析任务。 假设我有一个格式如下的文本文件:

val_0:       <--- "header"
key_0_0      <--- these keys should be set to the "header" or val0
key_0_1
key_0_2
...
...
val_n:     
...
key_n_m

我怎样才能得到一个散列 table,所有键都设置为它们的关联值?

编辑:我的解决方案。谁能改进一下?

open Core.Std

let contains s1 s2 =
        let re = Str.regexp_string s2 in
        try ignore (Str.search_forward re s1 0); true
        with Not_found -> false


let read_db f = 
        let tbl = Caml.Hashtbl.create 123456 in
        let lines = In_channel.read_lines f in
        let src = ref "" in
        List.iter ~f:(fun g -> if contains g ":" then src := else Caml.Hashtbl.add tbl g !src) lines;
        tbl

这是我的解决方案,仅供比较。

let line_opt ic =
    try Some (input_line ic) with End_of_file -> None

let fold_lines_in f init fn =
    let ic = open_in fn in
    let rec go accum =
        match line_opt ic with
        | None -> accum
        | Some line -> go (f accum line)
    in
    let res = go init in
    close_in ic;
    res

let hashtable_of_file fn =
    let ht = Hashtbl.create 16 in
    let itab label line =
        let len = String.length line in
        if line.[len - 1] = ':' then
            String.sub line 0 (len - 1)
        else
            let () = Hashtbl.add ht line label in
            label
    in
    let _ = fold_lines_in itab "" fn in
    ht

更新

(修复了非尾递归折叠实现,抱歉。)