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

时间:2016-04-04 00:57:22

标签: f# c#-to-f#

我对F#语言很陌生,更不用说函数编程了,我在实现Map数据结构时遇到了麻烦。这个Map的C#类型等价物是:

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

我已经尝试自己实现并在线搜索,但我对该语言缺乏经验让我失望。

有人能告诉我:

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

2 个答案:

答案 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