2012-08-01 18 views
7

Ho notato che i metodi statici sembrano più popolari in F # rispetto a C#. In C#, devi sempre aggiungere un elemento ad una collezione chiamando un metodo di istanza:Stile di codifica F #: metodi statici o istanza

mySet.Add(elem); 

Ma in F # di solito c'è un metodo statico equivalente:

mySet.Add(elem) 
// OR 
Set.Add elem mySet 

E ho visto la quest'ultima forma abbastanza spesso nei campioni. Entrambi mi sembrano completamente identici sia semanticamente che funzionalmente, ma provenendo da uno sfondo C#, l'uso del metodo di istanza sembra più naturale. Qual è lo stile migliore in F # e perché?

+0

Correlato: http://stackoverflow.com/q/7698133/162396 – Daniel

+0

spostare per rispondere. –

+0

Ci sono tanti motivi, radicati nella programmazione funzionale nel suo insieme, e alcuni particolari in F #, è difficile sapere da dove cominciare a giustificarlo. Una volta che ti familiarizzi con la programmazione funzionale diventerà ovvio. – Daniel

risposta

8

Oltre ai motivi menzionati in questa risposta relativi all'inferenza di tipo, in stile funzionale è più naturale inviare una funzione come parametro. Se si tratta di un metodo di istanza si dovrà scrivere qualcosa del genere:

myHigherOrderFunction (fun (x:MyType) -> x.myFunctionAsMethod) 

Ma se è definito come un metodo statico è possibile scrivere:

myHigherOrderFunction MyType.myFunctionAsMethod 

che è più elegante, più facile da scrivi (per leggere anche) ed è quasi la stessa sintassi di quando si invia una normale funzione rilegata.

Un metodo di istanza richiede un'istanza del tipo per accedere alla funzione (il metodo), in OOP questo non è un problema perché si pensa di inviare messaggi agli oggetti ma in FP, le funzioni da solo (senza istanze) sono cittadini di prima classe.

Per accedere a un metodo statico è necessario specificare la classe, è possibile visualizzare la classe come un tipo di contenitore (come moduli o spazi dei nomi) con funzioni.

+0

casi d'uso eccellenti sullo stile fp. E nella programmazione di stile, le funzioni di istanza sono più brevi. – nicolas

0

In f # come linguaggio funzionale più nativo per separare variabili che sono immutabili e funzioni che sono operazioni. Funziona in modo simile ai metodi statici in C#, ma c'è un vantaggio delle funzioni prima dei metodi C#. È un'applicazione parziale. È possibile passare alla funzione alcuni parametri (non tutti) e questa funzione con una parte di parametri sarà una nuova funzione che necessita di altri parametri.

5

La maggior parte dei tipi F # standard è immutabile. Quando si lavora con oggetti immutabili, i metodi statici meglio ritraggono ciò che sta accadendo, per esempio:

mySet.Add(elem); 

Sembra mySet è mutato per includere elem, quando un insieme F # sarebbe tornato un nuovo mySet. Fortunatamente F # non riesce a compilare per essere sicuro di non commettere questo errore, ma porta ancora a codice confuso. Al contrario:

mySet |> Set.Add elm 

È distinto nella forma e sembra che restituisca qualcosa di nuovo, senza essere troppo lontano dall'originale.

2

Mentre i metodi statici in F # sono molto comuni, trovo che i metodi di istanza abbiano molto senso per lo sviluppo di componenti.

Il motivo? Il sistema del modulo F # non ha funzioni. In altri formati di ML come SML o OCaml, si sviluppano componenti come moduli semplici. Se in seguito decidi di parametrizzare il modulo, puoi promuoverlo su un functor senza riscrivere troppo del tuo codice sorgente. In F # non puoi.

Per creare un "modulo" parametrizzato in F #, è necessario ricorrere a una classe e trasformare i metodi in metodi di istanza, passando i parametri durante la costruzione dell'istanza. Sfortunatamente passare da un modulo ad una classe comporta un po 'di cambiamenti meccanici ma fastidiosi del codice sorgente. Pertanto, un programmatore di componenti hard-core potrebbe optare per lavorare con classi e metodi di istanza di default, proprio come in C#. Questo ricorda uno stile "solo per i funtori" a volte utilizzato in SML.