我从下面的Map.fold阅读了链接的文档
val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
这个函数与List.fold_left类似吗?我是OCaml的新手,发现函数的参数描述很难解析。我的理解是,Map.fold将函数应用于映射中的条目,然后将这些条目存储在新的映射或某种累加器中。这是正确的理解吗?我知道'a表示任何类型的值-- 'b是否意味着一个由函数转换的新值?
发布于 2018-09-28 01:02:54
Map.fold非常像List.fold_left。请注意,List.fold_left本身并不产生新的列表。它比这更普遍--它在处理列表元素时,保持一个任意类型的值。
类似地,Map.fold在处理映射的元素时,递增地计算任何所需类型的值(您给出的类型签名中的'b类型)。
要使此操作,需要提供一个由三个参数组成的函数,这些参数处理映射的一个元素。第一个参数是map元素的键。第二个参数是map元素的值。第三个参数是增量计算的当前值。函数的返回值是新的增量计算值。
在处理完所有映射元素之后,Map.fold返回'b类型的最终值。
下面是一个函数,它将列表中的元素与List.fold_left相加
let list_sum l =
List.fold_left (+) 0 l在构建映射时,需要指定键的类型。下面是一个函数,它将键为字符串的映射的值相加:
module StringMap = Map.Make(String)
let map_sum m =
StringMap.fold (fun k v accum -> v + accum) m 0https://stackoverflow.com/questions/52546827
复制相似问题