将复杂的 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>[]>[]>>();
我尝试自己实现并在网上搜索,但我对这门语言的经验不足让我失望。
有谁能告诉我:
- 此结构的不可变实现
- 可变实现
例如像这样:
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>
这与上面的类型完全相同,但对于大多数用例来说,它的可读性更高 很多。而且它有 零 开销,因为缩写将在编译期间简单地替换为本机类型。
我对 F# 语言还很陌生,更不用说函数式编程了,而且我在实现 Map 数据结构时遇到了麻烦。此 Map 的 C# 类型等效项为:
var map = new Dictionary<int, Dictionary<int, Tuple<char, Tuple<int, int>[]>[]>>();
我尝试自己实现并在网上搜索,但我对这门语言的经验不足让我失望。
有谁能告诉我:
- 此结构的不可变实现
- 可变实现
例如像这样:
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>
这与上面的类型完全相同,但对于大多数用例来说,它的可读性更高 很多。而且它有 零 开销,因为缩写将在编译期间简单地替换为本机类型。