在签名文件中共享受歧视的联合

时间:2009-04-09 11:00:35

标签: .net f# functional-programming

我有一个有区别的联合,我希望将其用作我在签名文件中公开的函数的参数。目前我的代码定义如下:

Signature.fsi:

type Union =
| Part of string
| Part2 of int

val Func: Union -> unit

在单独的fs文件中定义Func。

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

例如:

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#,我还是比较绿。

2 个答案:

答案 0 :(得分: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!"))

如果您open Test模块,则可以按如下方式重新编写AnotherTest.fs:

#light
open Test

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

有关更全面的教程,请参阅F# Modules and Namespaces

答案 1 :(得分:1)

您的f#项目需要按正确的顺序订购文件。这意味着将包含Func定义的文件放在(字面上)比使用它的文件更高。您可能需要考虑将此类防御放在fsi文件中。

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