F# - 类型扩充VS类型扩展

时间:2013-03-23 01:53:58

标签: f# type-extension

F#的类型扩充和类型扩展之间究竟有什么区别,我们真的需要它们吗?

是否存在一个比另一个更好的情况,反之亦然?

我问的是因为我最近在F#上做过讲座,讲师在那里谈到了这两个讲座,然后评论说他看不出两者都被包含在F#语言中的原因。

更新

好的,所以 Vladislav Zorov 链接到一个页面,其中包含在定义自己的类型和扩展时使用类型扩充的示例(或增加?)外部类型。

pad 指向MSDN页面的链接,他们称之为内在和可选类型扩展名

两者似乎都说明了同样的事情。有人可以提供类型扩展的具体示例和类型扩充的另一个具体示例,以便明确说明这两件事究竟是什么?

2 个答案:

答案 0 :(得分:10)

MSDN's Type Extensions page中的以下位是相关的(强调我的):

  

有两种形式的类型扩展稍有不同   语法和行为。 内在扩展是一个扩展   出现在同一个命名空间或模块中,在同一个源文件中,和   在与该类型相同的程序集(DLL或可执行文件)中   延长。 可选扩展程序是一个显示在外部的扩展程序   类型的原始模块,命名空间或程序集   延长。 类型为时,类型上会出现内部扩展   通过反射检查,但可选扩展没有。可选的   扩展必须在模块中,并且它们仅在范围内时   包含扩展程序的模块已打开。

可选扩展的目的很明确。它可以帮助您为不属于程序集的类型注入新功能。例如,FSharpx使用它来创建various helpers来解析基元类型:

open System

type Boolean with
    static member parse x =
        match bool.TryParse(x) with
        | true,v -> Some v
        | _ -> None

为什么你需要内在延伸呢?答案是它的便利性。我发现将类型定义细分为多个部分非常有用。

在许多F#库中,我看到了使用以下模式:类型定义 - >效用函数 - >内在延伸。通过这种方式,您可以在类型上定义复杂的实用程序函数,使它们在模块中可用,并且仍然可以直接在成员定义中使用它们。您可以查看F#PowerPack中的Complex type以查看模式。

修改

说实话,我经常交替使用类型扩展类型扩充。重要的是它们是内在的还是可选的。

答案 1 :(得分:4)

他们是不同的东西。类型扩充,当在同一命名空间,模块和源文件中定义时,实际上在编译时成为该类型的一部分。类型扩展(对于模块和源文件之外的类型的a.k.a.类型扩充)是使用.NET扩展方法实现的。

它们都使用相同的语法,唯一的区别是你提到的类型是否在同一个命名空间和程序集中,即你是在扩充自己的代码,并且可以在编译之前将其他方法添加到你的类型中。

来源:http://tomasp.net/blog/fsharp-iii-oop.aspx

修改

这是一个术语混淆,他们都指的是同一件事 - 内在扩展是第一种类型扩充(即相同的命名空间和程序集) ,可选扩展类型扩充的第二种类型(即第三方程序集,在博客文章中这是List<T>扩充示例)。

我假设当你的讲师谈论类型扩充时,他指的是内在扩展,即第一类扩充,当他谈论类型扩展时,他正在谈论关于可选扩展或第二类扩充。