你总是听说函数式代码本质上比非函数式代码更容易并行化,所以我决定编写一个函数来执行以下操作:
给定一个字符串输入,合计每个字符串的唯一字符数。因此,给定输入[ "aaaaa"; "bbb"; "ccccccc"; "abbbc" ]
,我们的方法将返回a: 6; b: 6; c: 8
。
这是我写的:
(* seq<#seq<char>> -> Map<char,int> *)
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 中。
我希望将内部循环分解到自己的线程中,并且我不想使用任何可变状态。我将如何使用异步工作流重写此函数?