13

F# 的类型增强和类型扩展之间到底有什么区别,我们真的需要两者吗?

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

我之所以问,是因为我最近在 F# 中进行了一次讲座,讲师谈到了两者,然后评论说他看不出两者都包含在 F# 语言中的原因。

更新:

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

pad链接到一个 MSDN 页面,他们称之为内部和可选类型扩展

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

4

2 回答 2

11

MSDN 的类型扩展页面中的以下位是相关的(强调我的):

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

可选扩展的目的很明确。它可以帮助您向不属于您的程序集的类型注入新功能。例如,FSharpx 使用它来创建各种帮助器来解析原始类型:

open System

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

那你为什么需要内在扩展呢?答案是它的便利性。我发现将类型定义分解为具有明确目的的多个部分很有用。

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

编辑:

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

于 2013-03-23T07:20:06.710 回答
5

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

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

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

编辑:

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

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

于 2013-03-23T02:05:30.067 回答