我对F#语言很陌生,更不用说函数编程了,我在实现Map数据结构时遇到了麻烦。这个Map的C#类型等价物是:
var map = new Dictionary<int, Dictionary<int, Tuple<char, Tuple<int, int>[]>[]>>();
我已经尝试自己实现并在线搜索,但我对该语言缺乏经验让我失望。
有人能告诉我:
答案 0 :(得分:4)
单纯的翻译非常简单:
Dictionary
要么变成Map
(如果你想要一个不可变的结构),要么保持不变(如果你想要可变性)Tuple<a, b>
在类型声明中变为a * b
,在变量用法中变为(x, y)
。因此,如果我们选择不变性,我们会得到:
Map<int, Map<int, (string * (int * int)[])[]>>
但坦率地说,那是不可读的。幸运的是,F#有完美的解决方案:type abbreviations。
这种复杂类型可以分解为一堆别名或缩写,它们可以更清楚地向人类读者表达问题域。例如,您可以:
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>
与上面完全相同的类型,但对于大多数用例而言, lot 更具可读性。并且它具有零开销,因为在编译期间缩写将简单地替换为本机类型。
答案 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