2009-04-09 4 views
2

Ich habe eine diskriminierte Union, die ich als Argument für eine Funktion verwenden möchte, die ich in einer Signaturdatei verfügbar mache. Zur Zeit habe ich den Code als solche definiert:Freigeben diskriminierter Vereinigungen in Signaturdateien

Signature.fsi:

type Union = 
| Part of string 
| Part2 of int 

val Func: Union -> unit 

Mit Func in einer separaten fs-Datei definiert werden.

Das Problem ist, wenn ich dies tun die FS-Datei kann nicht die Union-Definition abholen, so dass Code, der einen Teil oder Part2-Wert erstellt fehlschlägt. Es sei denn, ich definiere die Verbindung erneut in der fs-Datei, die die Union verwendet.

So zum Beispiel:

Signature.fs:

type Union = 
| Part of string 
| Part2 of int 

let Func input:Union = 
    ignore 

OtherFile.fs

type Union = 
| Part of string 
| Part2 of int 

let DoSomething = 
    Func(Part("Test")) 

Ohne Union dies nicht jedes Mal neu zu definieren. Habe ich etwas Offensichtliches verpasst? Ich bin immer noch ziemlich grün, wenn es um F # geht.

Antwort

4

Ich glaube, du bist für so etwas suchen:

Test.fsi:

#light 

type Union = 
    | Part of string 
    | Part2 of int 

val awesome: Union -> unit 

Test.fs:

#light 

type Union = 
    | Part of string 
    | Part2 of int 

let awesome (x :Union) = printfn "%A" x 

Dies ist ein Modul Test die genannt schafft können Sie Zugriff von anderen Dateien:

AnotherTest.fs:

#light 

let wickedAwesome() = 
    Test.awesome(Test.Part("hellz yeah!")) 

Wenn Sie open das Test Modul können Sie wieder schreiben AnotherTest.fs wie folgt:

#light 
open Test 

let wickedAwesome() = 
    awesome (Part("hellz yeah!")) 

Siehe F# Modules and Namespaces für eine ausführliche Anleitung.

+1

das ist, was ich am Ende bin ... Ich bin nur irgendwie genervt Ich muss den Typ zweimal definieren, einmal in der Signatur und einmal im Rest des Moduls ... Ich hoffe, dass dies geändert wird Irgendwann. – Massif

+0

Es ist jetzt 2015 und ich denke das Problem ist das immer noch da, dh.Wenn ich eine dissoziierte Vereinigung in einer FSI-Datei habe, dann habe ich sie in ihrer Gesamtheit in der .fs-Datei definiert. Das finde ich auch ein bisschen nervig. –

1

Ihr f # -Projekt muss die Dateien in der richtigen Reihenfolge bestellen. Dies bedeutet, dass die Datei, die die Definition von Func enthält, höher platziert wird (wörtlich) als die Dateien, die sie verwenden. Vielleicht sollten Sie in Betracht ziehen, solche Definitionen stattdessen in fsi-Dateien zu speichern.

Ich würde darauf hinweisen, dass die Verwendung des Typenbezeichnung Func ist eine sehr schlechte Idee angesichts der Prävalenz (und Annahme von den meisten Benutzern), dass Func die 3.5 standard (* -> x) delegates bedeutet.

+0

Nun, mit Union für eine Union wäre wahrscheinlich eine schlechte Idee! Sie sind nur Platzhalter für die Frage. – Massif

+0

Ah richtig, ich bin ein Foo Bar Baz irgendwie ein Kerl selbst :) Reparieren Nachbestellen Ihr Problem? – ShuggyCoUk

+0

Eine Kombination aus Dateireihenfolge und dem, was Prinzessin gesagt hat, hat mich zum Laufen gebracht. Ich ärgere mich immer noch, dass ich den Typ an mehr Stellen als nur an der Signaturdatei definieren muss. – Massif