将文件解析为 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
更新
(修复了非尾递归折叠实现,抱歉。)
我正在尝试学习函数式编程,但很难用函数式方式表达文件解析任务。 假设我有一个格式如下的文本文件:
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
更新
(修复了非尾递归折叠实现,抱歉。)