繁体   English   中英

在签名文件中共享已区分的联合

[英]Sharing discriminated unions in Signature files

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

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

每次失败均不重新定义Union。 我错过了明显的事情吗? 关于F#,我还是很环保的。

我认为您正在寻找这样的东西:

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#模块和命名空间

您的f#项目需要以正确的顺序对文件进行排序。 这意味着将包含Func定义的文件放置在比使用它的文件更高的位置(从字面上看)。 您可能需要考虑将此类定义放置在fsi文件中。

我要指出的是,考虑到Func意味着3.5标准(*-> x)委托 ,使用类型名称Func是一个非常糟糕的主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM