您总是听说功能代码本质上比非功能代码更容易并行化,因此我决定编写一个执行以下操作的函数:
给定字符串输入,总计每个字符串的唯一字符数.因此,给定输入[ "aaaaa"; "bbb"; "ccccccc"; "abbbc" ]
,我们的方法将返回a: 6; b: 6; c: 8
.
这是我写的:
(* seq<#seq> -> Map *) let wordFrequency input = input |> Seq.fold (fun acc text -> (* This inner loop can be processed on its own thread *) text |> Seq.choose (fun char -> if Char.IsLetter char then Some(char) else None) |> Seq.fold (fun (acc : Map<_,_>) item -> match acc.TryFind(item) with | Some(count) -> acc.Add(item, count + 1) | None -> acc.Add(item, 1)) acc ) Map.empty
这段代码理想上是可并行化的,因为每个字符串input
都可以在自己的线程上处理.它不像它看起来那么简单,因为内部循环将项添加到所有输入之间共享的Map.
我想将内部循环考虑到自己的线程中,我不想使用任何可变状态.如何使用Async工作流程重新编写此功能?