我正在编写一个简单的OCaml函数来创建关联列表。输入是一个字符串,它以与字符串相同的顺序转换为非唯一字列表,然后输出为(word,[indices in list])的关联列表。在OCaml中手动缩减列表
例
let f "a b c b a b" = ...
expected output => [("a", [0,4]), ("b", [1,3,5]), ("c", [2])] # order not important
到目前为止,我已经成功地得到这个中间输出
[("b", 5); ("a", 4); ("b", 3); ("c", 2); ("b", 1); ("a", 0)]
,但我坚持试图找出如何将这一数字减少到最终的结果。
从原始输入创建Hashtbl
会更有意义吗?然后Hashtbl
- >list
??
或者减少中间结果是否简单?我工作的环境无法访问List.reduce
,所以我不得不手动编写reduce函数。
当我看着这个,看起来Hashtbl
会更有效,因为单词的数量增长。编辑:Hashtbl
绝对看起来像要走的路。我已经有以下哈希表:
"a" : [4,0], "b" : [5,3,1], "c" : [2]
但我不知道如何转换为列表现在。 Hashtbl.iter
对每个单独的绑定进行操作,例如,它会分开重复("a", 4)
和("a", 0)
(我的理解),这会破坏目的。建议?
它的一个(字符串,int列表)Hashtbl.t。但是当我阅读Hashtbl.iter(或折叠)的文档时,它听起来像它不会将列表视为对键的绑定,而是每个列表元素都是对该键的单独绑定。我错了吗? thx –
然后你可以使用'Hashtbl.iter'或'Hashtbl.fold'。试试看! –
正在编辑评论,因为你回应,thx再次......“但是当我阅读Hashtbl.iter(或折叠)文档时,它听起来像它不会将列表视为一个键绑定,而是每个列表元素是一个单独绑定到密钥。我错了吗?thx“ –