将复杂的 Map 数据结构转换为 F#

Converting complex Map data structure to F#

我对 F# 语言还很陌生,更不用说函数式编程了,而且我在实现 Map 数据结构时遇到了麻烦。此 Map 的 C# 类型等效项为:

var map = new Dictionary<int, Dictionary<int, Tuple<char, Tuple<int, int>[]>[]>>();

我尝试自己实现并在网上搜索,但我对这门语言的经验不足让我失望。

有谁能告诉我:

  1. 此结构的不可变实现
  2. 可变实现

例如像这样:

let t1 = (2,3)
let t2 = ("a",t1)
let m1 = Map([1,t2])
let m2 = Map([2,m1])

这个签名是:

val it : Map<int,Map<int,(string * (int * int))>> = map [(2, map [(1, ("a", (2, 3)))])]

这是使用列表而不是数组。

对于可变部分,您已经展示了实现。只需使用

System.Collections.Generic.Dictionary

不确定,但也许这对您有帮助:F# map to C# Dictionary

光是翻译就很简单了:

  • Dictionary 要么变成 Map(如果你想要一个不可变的结构),要么保持原样(如果你想要可变性)
  • Tuple<a, b>在类型声明中变为a * b,在变量使用中变为(x, y)

因此,如果我们采用不变性,我们会得到:

Map<int, Map<int, (string * (int * int)[])[]>>

但坦率地说,这是不可读的。幸运的是,F# 对此有完美的解决方案:type abbreviations.

该复杂类型可以分解为一堆别名,或缩写,它们可以更清楚地向人类表达问题域reader。例如,您可以:

type Cell = int * int

type Zone = Cell []

type Battleship = string * Zone

type Flotilla = Battleship []

type TaskForce = Map<int, Flotilla>

type Fleet = TaskForce []

type NavalTheater = Map<int, Fleet>

这与上面的类型完全相同,但对于大多数用例来说,它的可读性更高 很多。而且它有 开销,因为缩写将在编译期间简单地替换为本机类型。