编写字符串列表的不可变 F# 映射

Posted

技术标签:

【中文标题】编写字符串列表的不可变 F# 映射【英文标题】:Compose immutable F# map of list of strings 【发布时间】:2012-10-27 23:37:30 【问题描述】:

在 C# 中,我可以很容易地构建 Dictionary<string, List<string>>。如果我正在阅读大型项目数据库,我可以执行以下操作:

var dict = new Dictionary<string, List<string>>();
foreach(string[] row in data)
   if (!dict.ContainsKey(row[0]))
      dict.add(row[0], new List<string>()  row ;
   else
      dict[row[0]].add(row);

现在的问题是,我如何在 f# 中使用不可变的 Map&lt;string, string list&gt; 执行此操作?

【问题讨论】:

【参考方案1】:
data
|> Seq.groupBy (fun row -> row.[0])
|> Map.ofSeq

【讨论】:

【参考方案2】:

这是一个更详细的解决方案,与您的 C# 示例非常相似:

data |> Seq.fold (fun map row -> 
                 match Map.tryFind row.[0] map with
                 | Some rows -> Map.add row.[0] (row::rows) map
                 | None -> Map.add row.[0] [row] map) Map.empty

【讨论】:

我喜欢 fold 的用法,但 Daniel 对高阶函数的使用更惯用。 同意——这是一个补充解决方案。 我很好奇,这怎么接近?它使用了更多像 C# 这样的字符? 是的,它更冗长。 Seq.fold 类似于带有累加器字典的foreach 我也很欣赏这个答案,因为它帮助我了解在没有好的高级功能可以使用的情况下如何使用地图。

以上是关于编写字符串列表的不可变 F# 映射的主要内容,如果未能解决你的问题,请参考以下文章

当我们创建空的不可变列表/集合/映射时,是否有任何实际的应用程序/用例

保留插入顺序的不可变 Scala Map 实现

python中的不可变类型和可变类型

python可变和不可变类型

第7章

数据类型