2016-04-04 45 views
1

我对F#语言来说很新颖,更不用说函数式编程了,而且我在实现Map数据结构时遇到了麻烦。 C#的类型相当于该地图将是:将复杂的地图数据结构转换为F#

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

我试过这个工具我自己和网上搜索,但我的语言经验的缺乏让我失望。

有没有人能告诉我:

  1. ,不可变的实现这种结构
  2. 一个可变的实施
+0

你卡在什么特别的地方?你不能让现有的类型工作,或者你想创建自己的类型吗? –

+0

@JohnPalmer我比任何东西都更加坚持语法。我可以制作一张地图,我可以制作一个列表和一个元组,但并不是所有这些元素都交织在这个结构中。 – Hayden

+0

你可以展示一些你的尝试吗?或者用简单的英语解释你想做什么?或者,也许至少显示等效的C#或VB代码? –

回答

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

+0

感谢您的回复,我对您发布的代码有一些疑问:1)我试图将(int * int)列表关联到列表中的单个字符,你是否能够更新你的答案,以适应这一点,如果你可以的话,2)我会如何初始化一个默认值,其中第一个地图的值为空映射? – Hayden

+0

我想我根据这个答案想出了我想要的,非常感谢! – Hayden

+0

你可以做'Map.empty '和1)把元组放在一个列表中。啊,对不起,你比我快。当然。 – s952163

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> 

这是完全相同的类型上面,但它是一个很多更具可读性,对于大多数使用情况。并且它具有开销,因为在编译期间缩写将简单地替换为本地类型。

+0

这是一个非常整洁的解决方案,谢谢! – Hayden