我有一个有区别的联合,我希望将其用作我在签名文件中公开的函数的参数。目前我的代码定义如下:
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#,我还是比较绿。
答案 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。