2013-03-23 159 views
10

F#类型扩充和类型扩展的区别究竟是什么,我们是否真的需要这两者?F# - 类型扩充VS类型扩展

是否有情况下一个比另一个好,反之亦然?

我在问,因为我最近在F#上做了一个演讲,演讲者谈论了这两个问题,之后他评论说他看不到两人都被包含在F#语言中的原因。

更新:

好了,弗拉季Zorov链接到一个网页使用型增强的例子都定义在自己的类型,并延伸(或增加?)外部类型。

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

两者似乎都说明了同样的事情。也许有人可以用类型扩展类型增加的另一个具体示例来具体示例,以便明确说明两件事情究竟是什么?

+0

你似乎把我们混在一起:)我连接到托马斯佩特里切克的博客,连同乔恩Skeet和尹朱他们写这个 - http://manning.com/petricek/,这是恕我直言最伟大的一个,关于F#的最详细的书籍。 – 2013-03-26 16:13:34

+0

哎呦,你说的对,我修好了。 :-) – phaz 2013-03-26 20:01:56

回答

9

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以查看模式。

编辑:

说实话,我经常使用类型扩展型增强互换。重要的是它们是内在的还是可选的。

4

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

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

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

编辑:

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

当你的讲师在谈论型扩充我认为,他指的是内在的扩展,即第一种类型的扩充,而当他在谈论类型扩展,他在谈论可选的扩展,或第二种类型的扩充。