サーチ…


備考

タイプとモジュールを拡張するときは、拡張コードをすべて呼び出すコードの前に追加/ロードする必要があります。また、関連する名前空間をオープン/インポートすることによって、呼び出しコードで利用可能にする必要があります。

既存の型に新しいメソッド/プロパティを追加する

F#では、関数が定義されているときに型(たとえば、 レコード型 )に「メンバ」として関数を追加することができます。しかし、F#では、新しいインスタンスメンバを既存の型に追加することもできます。他の.net言語でも宣言されています。

次の例では、新しいインスタンスメソッドDuplicateStringすべてのインスタンスに追加します。

type System.String with
    member this.Duplicate times = 
        Array.init times (fun _ -> this)

thisは、拡張されている型のインスタンスを参照するために使用する任意に選択された変数名ですxは同様に機能しますが、おそらく自己記述性は低くなります。

次のように呼び出すことができます。

// F#-style call
let result1 = "Hi there!".Duplicate 3

// C#-style call
let result2 = "Hi there!".Duplicate(3)

// Both result in three "Hi there!" strings in an array

この機能は、C#の拡張メソッドと非常によく似ています。

同じ方法で既存のタイプに新しいプロパティを追加することもできます。新しいメンバが引数を取らない場合、それらは自動的にプロパティになります。

type System.String with
    member this.WordCount =
        ' ' // Space character
        |> Array.singleton
        |> fun xs -> this.Split(xs, StringSplitOptions.RemoveEmptyEntries)
        |> Array.length

let result = "This is an example".WordCount
// result is 4

既存の型に新しい静的関数を追加する

F#では、既存の型を新しい静的関数で拡張することができます。

type System.String with
    static member EqualsCaseInsensitive (a, b) = String.Equals(a, b, StringComparison.OrdinalIgnoreCase)

この新しい関数は次のように呼び出すことができます:

let x = String.EqualsCaseInsensitive("abc", "aBc")
// result is True

この機能は、機能の「ユーティリティ」ライブラリを作成する必要がなく、関連する既存のタイプに追加できることを意味します。これは、 カリングなどの機能を可能にする、より多くのF#対応バージョンの関数を作成するのに便利です。

type System.String with
    static member AreEqual comparer a b = System.String.Equals(a, b, comparer)

let caseInsensitiveEquals = String.AreEqual StringComparison.OrdinalIgnoreCase

let result = caseInsensitiveEquals "abc" "aBc"
// result is True

モジュールを使用して既存のモジュールおよびタイプに新しい機能を追加する

モジュールを使用して、既存のモジュールおよびタイプに新しい機能を追加することができます。

namespace FSharp.Collections

module List =
    let pair item1 item2 = [ item1; item2 ]

新しい関数は、Listの元のメンバーであるかのように呼び出すことができます。

open FSharp.Collections    

module Testing =
    let result = List.pair "a" "b"
    // result is a list containing "a" and "b"


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow