13

F# の型拡張と型拡張の正確な違いは何ですか? また、本当に両方が必要なのでしょうか?

一方が他方より優れている状況や、その逆の状況はありますか?

最近、講師が両方について話している F# の講義があり、その後、両方が F# 言語に含まれている理由がわからないとコメントしたため、質問しています。

アップデート:

わかりましたので、Vladislav Zorovは、独自の型を定義するときと、外部型を拡張 (または拡張?) するときに型拡張を使用する例を含むページにリンクしています。

MSDNページへのリンクを埋め込むと、組み込みおよびオプションの型拡張と呼ばれます。

どちらも同じことを示しているようです。2つのことが正確に何であるかを明示的に明確にするために、誰かが型拡張の具体例と拡張の別の具体例を持ってくることができますか?

4

2 に答える 2

11

MSDN の Type Extensions ページからの次のビットが関連しています (強調は私のものです)。

型拡張には、構文と動作がわずかに異なる 2 つの形式があります。組み込み拡張機能は、拡張される型と同じ名前空間またはモジュール、同じソース ファイル、および同じアセンブリ (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://toasp.net/blog/fsharp-iii-oop.aspx

編集:

これは用語の混同です。どちらも同じものを指しています。組み込み拡張機能は第 1 種の型拡張(つまり、同じ名前空間とアセンブリ) であり、オプションの拡張機能は第 2 種の型拡張(つまり、サード パーティのアセンブリなど) です。ブログ投稿これはList<T>拡張の例です)。

あなたの講師が型拡張について話しているとき、彼は本質的な拡張、つまり第 1 種型拡張について言及しており、型拡張について話しているとき、彼はオプション拡張、または第 2 種型拡張について話していると思います。

于 2013-03-23T02:05:30.067 に答える