2016-04-04 11 views
1

Ich bin ziemlich neu in der Sprache F #, geschweige denn funktionale Programmierung, und ich habe Probleme bei der Implementierung einer Map-Datenstruktur. Die C# Typ äquivalent diese Karte wäre:Konvertieren komplexer Map-Datenstruktur zu F #

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

Ich habe versucht, diese selbst zu implementieren und Online-Suche, aber meine Unerfahrenheit mit der Sprache läßt mich.

Ist jemand in der Lage, mir zu zeigen:

  1. Eine unveränderliche Umsetzung dieser Struktur
  2. A wandelbar Implementierung
+0

Welchen besonderen Punkt stecken Sie fest? Können Sie die vorhandenen Typen nicht verwenden oder versuchen Sie, Ihre eigenen zu erstellen? –

+0

@JohnPalmer Ich bin mehr auf die Syntax mehr als alles andere fest. Ich kann eine Karte erstellen, ich kann eine Liste erstellen und ein Tupel, aber nicht alle sind in dieser Struktur verwoben. – Hayden

+0

Können Sie einige Ihrer Versuche zeigen?Oder erklären Sie, was Sie in einfachem Englisch tun möchten? Oder, vielleicht, zeigen Sie mindestens äquivalenten C# oder VB Code? –

Antwort

2

Zum Beispiel wie folgt aus:

let t1 = (2,3) 
let t2 = ("a",t1) 
let m1 = Map([1,t2]) 
let m2 = Map([2,m1]) 

Die Signatur Dies ist:

val it : Map<int,Map<int,(string * (int * int))>> = map [(2, map [(1, ("a", (2, 3)))])] 

Dies verwendet Listen nicht Array.

Für den veränderbaren Teil zeigen Sie bereits die Implementierung. Verwenden Sie einfach

System.Collections.Generic.Dictionary 

nicht sicher, aber vielleicht ist das hilfreich für Sie: F# map to C# Dictionary

+0

Vielen Dank für Ihre Antwort, ich habe einige Fragen über den Code, den Sie gepostet: 1) Ich versuche, eine Liste von (Int * Int) zu verknüpfen ein einzelnes Zeichen in einer Liste, können Sie Ihre Antwort aktualisieren, um dies zu berücksichtigen, wenn Sie könnten, 2) Wie würde ich gehen, um einen Standardwert zu initialisieren, wo die erste Karte den Wert einer leeren Karte hat? – Hayden

+0

Ich denke, ich habe herausgefunden, was ich wollte basierend auf dieser Antwort, vielen Dank! – Hayden

+0

können Sie 'Map.empty ' und für 1) das Tupel in eine Liste einfügen. Ah, Entschuldigung, du warst schneller als ich. Sicher. – s952163

4

Die bloße Übersetzung ist ziemlich einfach:

  • Dictionary entweder wird Map (wenn Sie eine unveränderliche Struktur wollen) oder bleibt so wie es ist (wenn Sie Änderbarkeit wünschen)
  • Tuple<a, b> wird a * b in der Typdeklaration und (x, y) in der Variablenverwendung.

Wenn wir also mit Unveränderlichkeit gehen, erhalten wir:

Map<int, Map<int, (string * (int * int)[])[]>> 

Aber das ist, ehrlich gesagt, nicht lesbar. Zum Glück hat F # die perfekte Lösung dafür: type abbreviations.

Die komplexe Typ kann oder Abkürzungen, in einen Haufen von Aliase zerlegt werden, die die Problemdomäne mehr eindeutig auf einen menschlichen Leser auszudrücken. Zum Beispiel könnten Sie haben:

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> 

, die genau die gleiche Art wie oben ist, aber es ist ein viel besser lesbar, für die meisten Anwendungsfälle. Und es hat null Overhead, wie die Abkürzungen einfach mit den nativen Typen während der Kompilierung ersetzt werden.

+0

Dies ist eine ziemlich saubere Lösung, danke! – Hayden