具有签名文件中的接口的联合类型

时间:2014-04-16 14:17:23

标签: f# signature f#-3.0

在实现文件中给出以下代码:

namespace Lib

module Test =

    type ITest =
        abstract member IsTest: bool

    type T = Test with 
        interface ITest with
            member this.IsTest = true

    let create () = Test 

以下签名文件:

namespace Lib
module Test =  

    [<Interface>]
    type ITest =
        abstract member IsTest: bool

    type T 

    val create: unit -> T

发生以下警告:

警告2.类型实现接口'Test.ITest',但签名不会显示。您应该在签名中列出界面,因为界面可以通过动态类型转换和/或反射来发现。

如何在签名文件中更改T类型的签名以符合实现?

1 个答案:

答案 0 :(得分:0)

您应该在模块签名(fsi)文件中的类型定义中列出接口,例如:

namespace Lib
module Test =  

    [<Interface>]
    type ITest =
        abstract member IsTest: bool

    type T =
        interface ITest
        //you can list other interfaces here

    val create: unit -> T

注意,在fsi文件中指定接口时没有成员列表(我们在定义类型IsTest时省略了T成员),成员列表应该是模块实现的一部分( fs)文件。

更新

以上示例对F#4.0有效。由于OP使用F#-3.0标记标记了问题,因此旧F#的语法应该略有不同 - 在fsi文件中而不是

type T = ...

使用

type T with ...

如果您计划升级到F#4+,则必须像原始示例中那样进行更改。编译器将显示此更改的相关警告