我对F#语言来说很新颖,更不用说函数式编程了,而且我在实现Map数据结构时遇到了麻烦。 C#的类型相当于该地图将是:将复杂的地图数据结构转换为F#
var map = new Dictionary<int, Dictionary<int, Tuple<char, Tuple<int, int>[]>[]>>();
我试过这个工具我自己和网上搜索,但我的语言经验的缺乏让我失望。
有没有人能告诉我:
- ,不可变的实现这种结构
- 一个可变的实施
我对F#语言来说很新颖,更不用说函数式编程了,而且我在实现Map数据结构时遇到了麻烦。 C#的类型相当于该地图将是:将复杂的地图数据结构转换为F#
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。
即复杂类型可以被分解成一束别名,或缩写,其更清楚地表达问题域到人类读者。例如,你可以有:
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>
这是完全相同的类型上面,但它是一个很多更具可读性,对于大多数使用情况。并且它具有开销,因为在编译期间缩写将简单地替换为本地类型。
这是一个非常整洁的解决方案,谢谢! – Hayden
你卡在什么特别的地方?你不能让现有的类型工作,或者你想创建自己的类型吗? –
@JohnPalmer我比任何东西都更加坚持语法。我可以制作一张地图,我可以制作一个列表和一个元组,但并不是所有这些元素都交织在这个结构中。 – Hayden
你可以展示一些你的尝试吗?或者用简单的英语解释你想做什么?或者,也许至少显示等效的C#或VB代码? –