2009-04-09 8 views
2

J'ai une union discriminée que je veux utiliser comme argument pour une fonction que j'expose dans un fichier de signature. Actuellement, j'ai le code défini comme tel:Partage des unions discriminées dans les fichiers Signature

Signature.fsi: Avec Func

type Union = 
| Part of string 
| Part2 of int 

val Func: Union -> unit 

étant défini dans un fichier séparé fs. Le problème est que lorsque je fais cela, le fichier fs ne peut pas détecter la définition de l'Union, ce qui fait échouer le code qui crée une valeur Part ou Part2. Sauf si je définis de nouveau l'union dans le fichier fs qui utilise l'union.

Ainsi, par exemple:

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")) 

Sans redéfinir Union chaque fois que cela échoue. Ai-je manqué quelque chose d'évident? Je suis encore assez vert quand il s'agit de F #.

Répondre

4

Je pense que vous cherchez quelque chose comme ceci:

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 

Cela crée un module appelé Test que vous pouvez accès à partir d'autres fichiers:

AnotherTest.fs:

#light 

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

Si vous open le AnotherTest.fs comme suit le module Test, vous pouvez ré-écrire:

#light 
open Test 

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

Voir F# Modules and Namespaces pour un tutoriel plus complet.

+1

c'est ce que j'ai fini avec ... Je suis juste un peu ennuyé je dois définir le type deux fois, une fois dans la signature et une fois dans le reste du module ... J'espère que cela va changer à quelque point. – Massif

+0

Nous sommes en 2015 et je pense que le problème est toujours là, c'est-à-dire.si j'ai une union discriminée dans un fichier fsi, je la redéfinis dans son intégralité dans le fichier .fs. Je trouve ça un peu énervant aussi. –

1

Votre projet f # doit ordonner les fichiers dans le bon ordre. Cela signifie placer le fichier contenant la définition de Func plus haut (littéralement) que les fichiers qui l'utilisent. Vous pouvez envisager de placer ces défenitions dans les fichiers fsi à la place.

Je voudrais souligner que l'utilisation du nom de type Func est une très mauvaise idée étant donné la prévalence (et l'hypothèse de la plupart des utilisateurs) que Func signifie 3.5 standard (* -> x) delegates.

+0

Eh bien, utiliser Union pour une union serait probablement une mauvaise idée! Ils sont juste des espaces réservés pour le bien de la question. – Massif

+0

Ah c'est vrai, je suis un gars Foo Bar Baz moi-même :) Est-ce que re-commander régler votre problème? – ShuggyCoUk

+0

Une combinaison de l'ordre des fichiers et de ce que la princesse a dit m'a donné de bons résultats. Je suis toujours ennuyé d'avoir à définir le type dans plus d'endroits que juste le fichier de signature si. – Massif

Questions connexes