【发布时间】:2019-09-15 17:20:08
【问题描述】:
您好,我正在尝试理解以下代码。此代码的目的是计算素数出现的次数。 factors 函数只查找给定数字的质因数。
let smallArray = Array.Parallel.init 5 factors;;
let checkMap key map =
match Map.tryFind key map with
| Some i -> i
| None -> 0
let incr map (key:int) = Map.add key ((checkMap key map) + 1) map
Array.fold (List.fold incr) Map.empty smallArray;;
我卡住的地方是代码的最后一行。我不知道它是先执行 Array.fold 还是 List.fold,但我的猜测是 List.fold。下一步是将函数 incr 应用于小数组并将其放入一个空映射中,但函数 incr 接受 2 个参数,据我所知,我们只给它一个映射?有人可以解释一下吗?
【问题讨论】:
-
这段代码写得很混乱,很难解释。它可以简单地替换为
smallArray |> Seq.concat |> Seq.countBy id |> Map -
我上面给出的更简单的实现对于大数组来说也快得多。我认为这是因为
Seq.countBy使用了可变数据结构(在底层是安全的),而不是对不可变映射进行多次查找和更新。
标签: .net functional-programming f#