2010-02-05 3 views
9

C'è un modo per definire i propri operatori in F #?Puoi definire i tuoi operatori in F #?

Se così può qualcuno darmi un esempio per questo? Ho cercato brevemente, ma non ho trovato nulla.

+0

Per il tuo futuro riferimento Joan - il concetto si chiama overloading dell'operatore. Se tu F # di Google e Overloading dell'operatore troverai un bel po 'sull'argomento. –

+0

Grazie, lo farò in futuro. –

risposta

25

Sì:

let (+.) x s = [for y in s -> x + y] 
let s = 1 +. [2;3;4] 

I caratteri che possono essere utilizzati in un F # operatore sono elencati in section 3.7 of the spec. Sono !%&*+-./<=>@^|~ e per qualsiasi carattere dopo il primo, ?. Precedenza e fissità sono determinati dal primo carattere dell'operatore (vedere le specifiche).

È possibile creare i propri operatori let-bound come ho fatto sopra, nel qual caso funzionano esattamente come funzioni rilegate. È inoltre possibile definire come membri su un tipo:

type 'a Wrapper = Wrapper of 'a with 
    static member (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let w = (Wrapper 1) +! (Wrapper 2) 

In questo caso, non è necessario aver pre-definito una funzione let-bound per utilizzare l'operatore; F # lo troverà sul tipo. Si può prendere in particolare buon vantaggio di questo utilizzando le definizioni in linea:

let inline addSpecial a b = a +! b 
let w2 = addSpecial w (Wrapper 3) 

Prendendo questo ancora di più, è possibile effettuare gli operatori sui vostri tipi in linea e, in modo da poterli utilizzare su una varietà ancora più ampia di casi di la tua classe:

type 'a Wrapper = Wrapper of 'a with 
    static member inline (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let wi = (Wrapper 1) +! (Wrapper 2) 
let wf = (Wrapper 1.0) +! (Wrapper 2.0) 
let wi2 = addSpecial wi wi 
let wf2 = addSpecial wf wf 
+3

sezione 4.4 (http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html) ha ulteriori informazioni sugli operatori di infisso e quali caratteri sono consentiti. – nlucaroni