Quali sono i vantaggi dell'utilizzo di C # rispetto a F # o F # rispetto a C #? [chiuso]


93

Lavoro per un'azienda tecnologica che fa più prototipi che spedizioni di prodotti. Mi è appena stato chiesto qual è la differenza tra C # e F #, perché MS ha creato F # e quali scenari sarebbe meglio di C #.

Uso il linguaggio da un po 'di tempo e lo adoro, quindi potrei facilmente andare avanti sulle fantastiche funzionalità di F #, tuttavia mi manca l'esperienza in C # per dire perché dovremmo usarne uno sull'altro.

Quali sono i vantaggi dell'utilizzo di C # rispetto a F # o F # rispetto a C #?


4
Mi sembra che ci siano già molte domande su SO che almeno in parte rispondono alla tua domanda. Hai provato a cercare utilizzando "[F #] keyword" invece di "f # keyword"? ("[f #] vantaggi", ad esempio)
Benjol

Risposte:


86

Vantaggi generali della programmazione funzionale rispetto ai linguaggi imperativi:

Puoi formulare molti problemi molto più facilmente, più vicini alla loro definizione e più concisi in un linguaggio di programmazione funzionale come F # e il tuo codice è meno soggetto a errori (immutabilità, sistema di tipi più potente, algoritmi ricurivi intuitivi). Puoi codificare quello che intendi invece di quello che il computer vuole che tu dica ;-) Troverai molte discussioni come questa quando lo cerchi su Google o addirittura lo cerchi in SO.

Vantaggi speciali di F #:

  • La programmazione asincrona è estremamente facile e intuitiva con async {}-expressions - Anche con ParallelFX, il codice C # corrispondente è molto più grande

  • Integrazione molto semplice di compilatori di compilatori e linguaggi specifici del dominio

  • Estendere la lingua in base alle tue esigenze: LOP

  • Unità di misura

  • Sintassi più flessibile

  • Soluzioni spesso più brevi ed eleganti

Dai un'occhiata a questo documento

I vantaggi di C # sono che è spesso più accurato per applicazioni "imperative" (interfaccia utente, algoritmi imperativi) rispetto a un linguaggio di programmazione funzionale, che il .NET Framework che utilizza è progettato in modo imperativo e che è più diffuso.

Inoltre puoi avere F # e C # insieme in un'unica soluzione, così puoi combinare i vantaggi di entrambi i linguaggi e usarli dove sono necessari.


16
Si combinano in modi molto strani. Ad esempio, puoi eseguire l'overload dell'operatore> in F #. Gli sviluppatori C # possono quindi usarlo. Tuttavia, gli sviluppatori F # non possono. Esatto, F # può emettere overload di operatori che non può consumare.
Jonathan Allen,

"questo documento" link è rotto ...
Eduardo Brites

36

È come chiedere qual è il vantaggio di un martello su un cacciavite. Ad un livello estremamente alto, entrambi fanno essenzialmente la stessa cosa, ma a livello di implementazione è importante selezionare lo strumento ottimale per ciò che stai cercando di ottenere. Ci sono attività che sono difficili e richiedono tempo in c # ma facili in f #, come provare a battere un chiodo con un cacciavite. Puoi farlo, di sicuro, semplicemente non è l'ideale.

La manipolazione dei dati è un esempio che posso indicare personalmente dove f # brilla davvero e c # può essere potenzialmente ingombrante. D'altro canto, direi che (in generale) l'interfaccia utente con stato complessa è più facile in OO (c #) che funzionale (f #). (Probabilmente ci sarebbero alcune persone che non sono d'accordo con questo dato che è "fico" in questo momento "dimostrare" quanto sia facile fare qualsiasi cosa in F #, ma io lo sostengo). Ce ne sono innumerevoli altri.


22
Se tutto ciò che hai è un martello, tutto sembra un chiodo. -Maslow
Charlie Salts

20
Non ho intenzione di votare questo perché non fornisce alcuna specifica reale tranne che per un esempio di dati. So che sono strumenti diversi. Chiedo quali sono i lavori in cui questi due strumenti sono migliori e peggiori in confronto tra loro. So che un philips è spesso lo strumento migliore per il lavoro anche se una testa piatta più piccola funzionerà.
gradbot

3
Se non ti voterà, lo farò. : P +1
Spencer Ruport

14
Se tutto ciò che hai è un martello, tutto sembra un pollice.
Ed Power

6
Sono d'accordo con gradbot, questa è una buona risposta quindi nessun voto negativo da parte mia, tuttavia non arriva alle specifiche delle domande originali. Questa risposta è solo una vaga spiegazione concettuale, ma manca davvero il punto di rispondere esattamente alla domanda.
Stan R.

27
  • F # offre prestazioni migliori rispetto a C # in matematica
  • È possibile utilizzare progetti F # nella stessa soluzione con C # (e chiamare da uno all'altro)
  • F # è ottimo per la programmazione algoritmica complessa, le applicazioni finanziarie e scientifiche
  • F # logicamente è davvero buono per l'esecuzione parallela (è più facile eseguire il codice F # su core paralleli rispetto a C #)

6
Informazioni su F # che ha prestazioni migliori rispetto a C # per la matematica: Apparentemente, non è vero. Vedi thoughtfulcode.wordpress.com/2010/12/30/…
Joh

3
@Joh: inlineè un ovvio esempio di qualcosa che può fornire enormi miglioramenti delle prestazioni in F # che C # non può esprimere.
JD

@ Jon Harrop: mi riferivo specificamente al post sul blog di Rinat. Sembra che i tempi a favore di F # che ha ottenuto fossero dovuti a codice C # non ottimale.
Joh

27

Per rispondere alla tua domanda come ho capito: perché usare C #? (Dici di essere già venduto su F #.)

Prima di tutto. Non è solo "funzionale contro OO". È "Funzionale + OO contro OO". Le caratteristiche funzionali di C # sono piuttosto rudimentali. I fa # non lo sono. Nel frattempo, F # fa quasi tutte le funzionalità OO di C #. Per la maggior parte, F # finisce come un superset delle funzionalità di C #.

Tuttavia, ci sono alcuni casi in cui F # potrebbe non essere la scelta migliore:

  • Interop. Ci sono molte librerie che semplicemente non saranno troppo comode da F #. Forse sfruttano certe cose di C # OO che F # non fa lo stesso, o forse si basano sulle parti interne del compilatore C #. Ad esempio, Expression. Sebbene sia possibile trasformare facilmente una citazione in F # in un'espressione, il risultato non è sempre esattamente quello che creerebbe C #. Alcune biblioteche hanno un problema con questo.

    • Sì, l'interoperabilità è una rete piuttosto grande e può causare un po 'di attrito con alcune librerie.

    • Considero l'interoperabilità da includere anche se si dispone di una base di codice esistente di grandi dimensioni. Potrebbe non avere senso iniziare a scrivere parti in F #.

  • Strumenti di progettazione. F # non ne ha. Non significa che non possa averne, ma al momento non puoi creare un'app WinForms con F # codebehind. Anche dove è supportato, come nelle pagine ASPX, attualmente non ottieni IntelliSense. Quindi, devi considerare attentamente dove saranno i tuoi limiti per il codice generato. Su un progetto molto piccolo che utilizza quasi esclusivamente i vari designer, potrebbe non valere la pena usare F # per la "colla" o la logica. Su progetti più grandi, questo potrebbe diventare un problema minore.

    • Questo non è un problema intrinseco. A differenza della risposta di Rex M, non vedo nulla di intrinseco in C # o F # che li renda migliori per fare un'interfaccia utente con molti campi mutabili. Forse si riferiva al sovraccarico extra di dover scrivere "mutabile" e usare <- invece di =.

    • Dipende anche dalla libreria / designer utilizzato. Ci piace usare ASP.NET MVC con F # per tutti i controller, quindi un progetto Web C # per ottenere i designer ASPX. Mescoliamo l'attuale "codice inline" ASPX tra C # e F #, a seconda di ciò di cui abbiamo bisogno in quella pagina. (IntelliSense e tipi F #.)

  • Altri strumenti. Potrebbero aspettarsi solo C # e non sapere come gestire i progetti F # o il codice compilato. Inoltre, le librerie di F # non vengono fornite come parte di .NET, quindi hai qualcosa in più da distribuire.

  • Ma il problema numero uno? Persone. Se nessuno dei tuoi sviluppatori desidera imparare F # o, peggio, ha gravi difficoltà a comprendere determinati aspetti, probabilmente stai brindando. (Anche se, in questo caso, direi che sei comunque un toast.) Oh, e se la direzione dice di no, potrebbe essere un problema.

Ne ho scritto qualche tempo fa: Why NOT F #?


6

Stai chiedendo un confronto tra un linguaggio procedurale e un linguaggio funzionale, quindi credo che la tua domanda possa trovare risposta qui: qual è la differenza tra programmazione procedurale e programmazione funzionale?

Quanto al motivo per cui MS ha creato F #, la risposta è semplicemente: la creazione di un linguaggio funzionale con accesso alla libreria .Net ha semplicemente ampliato la propria base di mercato. E visto come la sintassi è quasi identica a OCaml, non ha richiesto molto sforzo da parte loro.


1
Anche se penso che la tua risposta generale sia corretta sul fatto che la vera domanda riguarda il confronto tra paradigmi di programmazione e non linguaggi, credo che la risposta alla domanda a cui ti riferisci sia un po 'superficiale.
Jeroen Huinink

Sentiti libero di suggerire un'altra domanda se ne hai una migliore. Questo è il più votato che ho trovato da una ricerca su Google.
Spencer Ruport

1
Penso che stesse cercando di essere gentile con te che sembri uno stronzo per aver detto che F # non ha richiesto molti sforzi da parte di Micrsoft.
Matthew Whited

+1 per il commento sulla base di mercato. Semplice e ha qualcosa di vero.
gradbot

1
Non ci credo nell'altro collegamento che risponde alla mia domanda. C # supporta molti costrutti funzionali nelle versioni più recenti.
gradbot

5

F # non è ancora un altro linguaggio di programmazione se lo stai confrontando con C #, C ++, VB. C #, C, VB sono tutti linguaggi di programmazione imperativi o procedurali. F # è un linguaggio di programmazione funzionale.

Due principali vantaggi dei linguaggi di programmazione funzionale (rispetto ai linguaggi imperativi) sono 1. che non hanno effetti collaterali. Ciò semplifica notevolmente il ragionamento matematico sulle proprietà del programma. 2. che le funzioni sono cittadini di prima classe. È possibile passare funzioni come parametri ad altre funzioni con la stessa facilità con cui altri valori.

Entrambi i linguaggi di programmazione imperativi e funzionali hanno i loro usi. Sebbene non abbia ancora svolto un lavoro serio in F #, attualmente stiamo implementando un componente di pianificazione in uno dei nostri prodotti basato su C # e faremo un esperimento codificando lo stesso scheduler in F # per vedere se la correttezza del l'implementazione può essere convalidata più facilmente rispetto all'equivalente C #.


4
-1. F # è un linguaggio multi-paradigma (OO + FP). Solo i linguaggi puramente funzionali non hanno effetti collaterali (come Haskell), ma F # non è puro.
Mauricio Scheffer

5

F # è essenzialmente il C ++ dei linguaggi di programmazione funzionali. Hanno mantenuto quasi tutto da Objective Caml, comprese le parti davvero stupide, e lo hanno gettato sopra il runtime .NET in modo tale da portare anche tutte le cose cattive da .NET.

Ad esempio, con Objective Caml ottieni un tipo di null, l'opzione <T>. Con F # si ottengono tre tipi di null, opzione <T>, Nullable <T> e riferimenti null. Ciò significa che se hai un'opzione devi prima controllare se è "Nessuno", quindi devi controllare se è "Some (null)".

F # è come il vecchio clone di Java J #, solo un linguaggio imbastardito solo per attirare l'attenzione. Alcune persone lo adoreranno, altri addirittura lo useranno, ma alla fine è ancora una lingua vecchia di 20 anni attaccata al CLR.


2
+1, Questa potrebbe essere la fredda dura verità, tuttavia sono ancora abbastanza felice di poter usare un linguaggio funzionale in VS con .NET
gradbot,

1
Sono d'accordo che Nullable <T> dovrebbe fare in modo che il compilatore esegua un po 'di alias magico per noi. Non sono sicuro che rendere "Some null" equivalente a None funzionerebbe sempre: del codice di interoperabilità potrebbe fare affidamento su di esso. Ma riferimento nullo? Come intendi aggirare un grave buco in .NET? Avvolgere ogni tipo di riferimento in un'opzione? In pratica, questo sembra essere un problema solo con alcuni scenari di interoperabilità.
MichaelGG

12
FWIW, codifico professionalmente in F # da diversi anni (più a lungo di quasi chiunque altro al mondo) e non ho mai visto questo problema o il codice Some nullin alcun codice F # da nessuna parte. Di tutte le cose di cui le persone potrebbero lamentarsi, questo deve essere mooolto in fondo alla lista ...
JD

1
Il confronto tra F # e C ++ è un po 'inverosimile. Molte parti di C ++ hanno una semantica indefinita o poco chiara, F # è semplice e ben definito. La qualità del runtime .NET non può essere mantenuta rispetto a F #, poiché qualsiasi linguaggio .NET avrà gli stessi problemi.
Joh

1
In oltre 2 anni di programmazione F # professionale, come @ Jon, non ho mai visto alcun problema relativo a "Some null". D'altra parte, ho tratto enormi vantaggi dalle funzionalità del framework .Net.
Marc Sigrist

5

Uno degli aspetti di .NET che mi piace di più sono i generici. Anche se scrivi codice procedurale in F #, trarrai comunque vantaggio dall'inferenza del tipo. Rende facile scrivere codice generico.

In C #, scrivi codice concreto per impostazione predefinita e devi lavorare in più per scrivere codice generico.

In F # scrivi codice generico per impostazione predefinita. Dopo aver trascorso oltre un anno di programmazione sia in F # che in C #, trovo che il codice della libreria che scrivo in F # sia più conciso e più generico del codice che scrivo in C #, ed è quindi anche più riutilizzabile. Perdo molte opportunità di scrivere codice generico in C #, probabilmente perché sono accecato dalle annotazioni di tipo obbligatorie.

Ci sono tuttavia situazioni in cui è preferibile usare C #, a seconda dei gusti e dello stile di programmazione.

  • C # non impone un ordine di dichiarazione tra i tipi e non è sensibile all'ordine in cui vengono compilati i file.
  • C # ha alcune conversioni implicite che F # non può permettersi a causa dell'inferenza del tipo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.