2009-04-09 55 views
2

我有一个歧视联盟,我想用作我在签名文件中公开的函数的参数。目前,我有这样定义的代码:在签名文件中共享歧视联盟

Signature.fsi:

type Union = 
| Part of string 
| Part2 of int 

val Func: Union -> unit 

随着Func键在一个单独的FS文件中定义。

问题是,当我这样做时,fs文件无法获取联合定义,因此创建Part或Part2值的代码失败。除非我在使用联合的fs文件中再次定义联合。

因此,例如:

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

没有每次失败一次重新定义联盟。我错过了明显的东西吗?当谈到F#时,我仍然很绿。

回答

4

我认为你在寻找这样的事情:

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 

这将创建一个名为模块Test,你可以从其他文件访问:

AnotherTest.fs:

#light 

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

如果openTest模块,你可以重新写AnotherTest.fs如下:

#light 
open Test 

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

有关更详尽的教程,请参阅F# Modules and Namespaces

1

您的f#项目需要按正确顺序排列文件。这意味着将包含Func定义的文件放在更高的字面上,而不是使用它的文件。您可能需要考虑在fsi文件中放置这种防御。

我会指出,考虑到Func意味着3.5 standard (* -> x) delegates的普遍性(以及大多数用户的假设),使用类型名称Func是一个非常糟糕的主意。

+0

那么,使用联盟进行联盟可能是一个坏主意!为了这个问题,他们只是占位符。 – Massif 2009-04-09 13:34:31

+0

啊对,我是一个Foo酒吧巴兹有点自己的人:) 是否重新排序解决您的问题? – ShuggyCoUk 2009-04-09 13:44:38