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

F#-类型扩充与类型扩展,f#,type-extension,F#,Type Extension,F#的类型扩充和类型扩展之间到底有什么区别,我们真的需要两者吗 是否存在一种情况比另一种更好,反之亦然 我这样问是因为我最近在F#上了一次讲座,讲师谈到了这两种语言,然后评论说,他不明白为什么这两种语言都包含在F#语言中 更新: 好的,Vladislav Zorov链接到一个页面,其中包含定义自己的类型和扩展(或扩充?)外部类型时使用类型扩充的示例 pad链接到MSDN页面,他们称之为内在和可选的类型扩展 两者似乎说明了同一件事。有人能举一个具体的类型扩展的例子和另一个具体的类型扩充的例子来明确

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

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

我这样问是因为我最近在F#上了一次讲座,讲师谈到了这两种语言,然后评论说,他不明白为什么这两种语言都包含在F#语言中

更新:

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

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


两者似乎说明了同一件事。有人能举一个具体的类型扩展的例子和另一个具体的类型扩充的例子来明确说明这两个东西到底是什么吗?

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

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

资料来源:

编辑:

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

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

以下几点是相关的(我的重点):

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

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

open System

type Boolean with
    static member parse x =
        match bool.TryParse(x) with
        | true,v -> Some v
        | _ -> None
那么,为什么需要内部扩展呢?答案是方便。我发现将类型定义分解为多个部分很有用,目的很明确

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

编辑:


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

你似乎把我们搞混了:)我正在链接到托马斯·佩特里切克的博客,还有他们写的乔恩·斯基特和尹朱,这是有史以来关于F#最伟大、最详细的书之一。