Come si crea un metodo di estensione in F #, per esempio, come questo C# estensione:Come si crea un metodo di estensione (F #)?
public static string Right(this string host, int index)
{
return host.Substring(host.Length - index);
}
Come si crea un metodo di estensione in F #, per esempio, come questo C# estensione:Come si crea un metodo di estensione (F #)?
public static string Right(this string host, int index)
{
return host.Substring(host.Length - index);
}
Per un # un'estensione F che può essere chiamato da F #:
type System.String with
member x.Right(index) = x.Substring(x.Length - index)
Nota che a partire da Beta 1, questo non risulta in un metodo di estensione compatibile con C#.
Per generare metodi di estensione visibili da C# (ma non utilizzabili come metodi di estensione in F #), vedere il collegamento nella modifica di Brian al post originale.
So che questo non risponde alla tua domanda, ma vale la pena segnalarlo. In F # e in altri linguaggi funzionali si vedono spesso moduli con metodi statici (come il modulo Seq) progettati per essere composti con altre funzioni. Per quanto ho visto, i metodi di istanza non sono facilmente composti, il che è uno dei motivi per cui questi moduli esistono. Nel caso di questa estensione, potresti voler aggiungere una funzione al modulo String.
module String =
let right n (x:string) =
if x.Length <= 2 then x
else x.Substring(x.Length - n)
Quindi sarebbe usato così.
"test"
|> String.right 2 // Resulting in "st"
["test"; "test2"; "etc"]
|> List.map (String.right 2) // Resulting in ["st"; "t2"; "tc"]
Anche se in questo caso il metodo di estensione non sarebbe molto più codice.
["test"; "test2"; "etc"]
|> List.map (fun x -> x.Right 2)
maledizione, questo è quello che volevo. – esac