由于单元F#接口继承失败由于单元F#接口继承失败(F# interface inheritance

2019-05-12 04:54发布

没有人知道为什么这个编译失败?

type MyInterface<'input, 'output> = 
    abstract member MyFun: 'input -> 'output

type MyClass() = 
    interface MyInterface<string, unit> with
        member this.MyFun(input: string) = ()
    //fails with error FS0017: The member 'MyFun : string -> unit' does not have the correct type to override the corresponding abstract method.
type MyUnit = MyUnit
type MyClass2() = 
    //success
    interface MyInterface<string, MyUnit> with
        member this.MyFun(input: string) = MyUnit

Answer 1:

这看起来像F#语言讨厌极端情况,但我不知道这是否有资格作为由设计限制,或在编译器中的错误。 如果它是由设计限制,那么错误信息应该说是(因为目前,它并没有太大的意义)。

无论如何,问题是,F#编译器不产生实际包含的代码unit在IL类型。 它与替换它void或空参数列表(作为方法或函数参数使用时)(作为返回类型使用时)。

这意味着,在MyClass类型,编译器决定编译MyFun成员作为接受一个方法string并返回void (但你不能使用void的泛型类型参数,所以这是行不通的)。 原则上,编译器可以使用实际的unit在这种情况下,类型(因为这是得到它的工作的唯一途径),但可能会在其他地方产生其他矛盾。

你与创建招MyUnit是,我认为,要解决这个问题一个完美的好方法。 即使是核心F#库使用类似MyUnit在实施的一些地方(在异步工作流)来处理的一些限制unit (和它被编译的方式)。



文章来源: F# interface inheritance failure due to unit
标签: f# unit-type