当用作通用接口参数时,为什么`unit`被F#类型系统区别对待?

时间:2014-10-10 09:41:53

标签: f# unit-type

考虑这个界面:

type A<'a> =
    abstract X : 'a

让我们尝试用int作为通用参数来实现它:

{ new A<int> with member this.X = 5 } // all is well

现在,让我们试试unit

// Compiler error: The member 'get_X : unit -> unit' does not have the correct type to override the corresponding abstract method.
{ new A<unit> with member this.X = () }

现在,如果我们定义一个非通用接口,那么一切也很好:

type A_int =
    abstract X : int

{ new A_int with member this.X = 5 } // works

type A_unit =
    abstract X : unit

{ new A_unit with member this.X = () } // works as well!

我能解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

在F#中,声明返回类型为unit的抽象槽在.NET IL中编译为返回类型void。相反,一个抽象的槽,声明的返回类型为&#34; T&#34;在.NET IL中编译为&#34; T&#34;的通用返回类型,当unit实例化T时,它变为unit'

请参阅:F# interface inheritance failure due to unit

答案 1 :(得分:0)

您的通用成员X可以是任何类型的值。 &#39;单元&#39;在F#中实际上并不是一种类型(或者如果你愿意,它是非常特殊的类型) - 它没有任何价值。