F#
Typ- och modulförlängningar
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"