Sök…


Anmärkningar

I alla fall vid utökning av typer och moduler måste utökningskoden läggas till / laddas innan koden som ska ringa den. Det måste också göras tillgängligt för samtalskoden genom att öppna / importera relevanta namnutrymmen.

Lägga till nya metoder / egenskaper till befintliga typer

F # tillåter funktioner att läggas till som "medlemmar" till typer när de definieras (till exempel posttyp ). Men F # tillåter också nya instansmedlemmar att läggas till befintliga typer - även sådana som deklarerats någon annanstans och på andra .net-språk.

Följande exempel lägger till en ny instansmetod Duplicate till alla instanser av String .

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

Obs : this är ett godtyckligt valt variabelnamn som ska användas för att hänvisa till förekomsten av typen som utökas - x skulle fungera lika bra, men kanske skulle vara mindre självbeskrivande.

Det kan sedan kallas på följande sätt.

// 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

Denna funktionalitet är mycket lik Extension Methods i C #.

Nya egenskaper kan också läggas till befintliga typer på samma sätt. De blir automatiskt egenskaper om den nya medlemmen inte tar några argument.

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

Lägga till nya statiska funktioner i befintliga typer

F # tillåter att befintliga typer utökas med nya statiska funktioner.

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

Denna nya funktion kan påkallas så här:

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

Denna funktion kan innebära att de snarare än att behöva skapa "verktyg" -bibliotek med funktioner, kan läggas till relevanta befintliga typer. Detta kan vara användbart för att skapa fler F # -vänliga versioner av funktioner som tillåter funktioner som currying .

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

Lägga till nya funktioner i befintliga moduler och typer med hjälp av moduler

Moduler kan användas för att lägga till nya funktioner i befintliga moduler och typer.

namespace FSharp.Collections

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

Den nya funktionen kan sedan kallas som om den var en originalmedlem i Lista.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow