2016-07-19 13 views
4

von lokalen Arten ich eine Art bedeuten zu haben, die nur zugänglich innerhalb einer bestimmten Funktion istIst es möglich, lokale Typen in F #

Zum Beispiel können sagen, dass ich einige Daten nehmen wollen, formatieren und serialisiert sie json .

let parse data = // hypothetical scenario 
    type Record = { root : string[] } 
    let record = { root = data } 
    JsonConvert.SerializeObject record 

Es scheint, da die Art nirgendwo sonst benötigt wird, dies sollte funktionieren. Allerdings bekomme ich Kompilierfehler, wenn ich dies schreibe.

Gibt es eine Möglichkeit, ähnliche Funktionen in F # zu erhalten?

+0

Objektausdrücke - https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/object-expressions-%5Bfsharp%5D sind ähnlich –

+1

@JohnPalmer Sind diese nicht anonym, obwohl? Verlierst du nicht die Fähigkeit für einige polymorphe Sachen, wenn du das verwendest? – t3dodson

+2

Sie können 'private' Zugriffsmodifizierer verwenden, so dass auf Ihren Typ nur vom umgebenden Modul aus zugegriffen werden kann. – bytebuster

Antwort

4

F # unterstützt keine Typdeklarationen innerhalb eines Funktionsumfangs.

Die nächstgelegene Sie bekommen dazu ein Modul zu definieren ist und die Art lokal zu einem Modul halten:

module MyLogic = 
    type private LocalType = {root: string []} 
    let serialize data = 
     let record = {root = data} 
     JsonConvert.SerializeObject record 

Wenn Sie Ihren Serialisierungscode in ein separates Modul setzen, dann können Sie Ihre Art privat halten Das Modul verwendet den Modifizierer private, der es auch lokal zur Serialisierungsfunktion hält - nicht ganz auf eine einzige Funktion, aber einigermaßen nah.

Abgesehen davon, ich denke, Sie brauchen auch DataContract Attribut auf dem Datensatz, damit es tatsächlich funktioniert.