Domanda F # è davvero meglio di C # per la matematica?


Nonostante le lingue non gestite, F # è davvero migliore di C # per implementare la matematica? E se è così, perché?


30
2017-12-18 23:39


origine


risposte:


Penso che la maggior parte dei punti importanti siano già stati menzionati da qualcun altro:

  1. F # ti consente di risolvere i problemi in un modo in cui i matematici pensano a loro
  2. Grazie alle funzioni di ordine superiore, è possibile utilizzare concetti più semplici per risolvere problemi complessi
  3. Tutto è immutabile per impostazione predefinita, il che rende il programma più facile da capire (e anche più facile da parallelizzare)

È sicuramente vero che puoi utilizzare alcuni dei concetti di F # in C # 3.0, ma esistono dei limiti. Non è possibile utilizzare calcoli ricorsivi (poiché C # non ha ricorsione di coda) e questo è il modo in cui si scrivono i calcoli primitivi in ​​modo funzionale / matematico. Inoltre, scrivere complesse funzioni di ordine superiore (che prendono altre funzioni come argomenti) in C # è difficile, perché devi scrivere i tipi esplicitamente (mentre in F #, i tipi vengono dedotti, ma anche automaticamente generalizzati, quindi non devi fare esplicitamente una funzione generica).

Inoltre, penso che il seguente punto di Marc Gravell non sia una valida obiezione:

Da un angolo di manutenzione, sono del parere che le proprietà nominate in modo appropriato ecc siano più facili da usare (su un ciclo di vita completo) rispetto alle tuple e agli elenchi testa / coda, ma potrebbe essere solo io.

Questo è ovviamente vero. Tuttavia, il bello di F # è che puoi iniziare a scrivere il programma usando tuple e elenchi testa / coda e successivamente nel processo di sviluppo trasformalo in un programma che usa .NET IEnumerables e tipi con proprietà (ed è così che credo sia tipico F # programmatore funziona *). Tuples ecc. E gli strumenti di sviluppo interattivi F # ti danno un ottimo modo per prototipare rapidamente le soluzioni (e quando fai qualcosa di matematico, questo è essenziale perché gran parte dello sviluppo è solo sperimentare quando stai cercando la soluzione migliore). Una volta ottenuto il prototipo, è possibile utilizzare semplici trasformazioni del codice sorgente per includere il codice iniside come un tipo F # (che può essere utilizzato anche da C # come una classe ordinaria). F # offre anche molti modi per ottimizzare il codice in un secondo momento in termini di prestazioni.

Questo ti dà i vantaggi di langauges facili da usare (ad es. Python), che molte persone usano per la fase di prototipazione. Tuttavia, non è necessario riscrivere l'intero programma in un secondo momento dopo aver terminato la prototipazione utilizzando un linguaggio efficiente (ad esempio C ++ o forse C #), perché F # è sia "facile da usare" che "efficiente" e puoi passare in modo fluido tra questi due stili.

(*) Uso anche questo stile nel mio libro di programmazione funzionale.


32
2017-12-19 11:11



F # ha molti vantaggi enormi rispetto a C # nel contesto dei programmi matematici:

  • Le sessioni interattive F # consentono di eseguire il codice al volo per ottenere risultati immediati e persino visualizzarli, senza dover costruire ed eseguire un'applicazione completa.

  • F # supporta alcune funzionalità che possono fornire enormi miglioramenti delle prestazioni nel contesto della matematica. In particolare, la combinazione di inlinee le funzioni di ordine superiore consentono al codice matematico di essere elegantemente fattorizzato senza influire negativamente sulle prestazioni. C # non può esprimere questo.

  • F # supporta alcune funzionalità che consentono di implementare concetti matematici molto più naturalmente di quanto si possa ottenere in C #. Ad esempio, le chiamate di coda rendono molto più semplice l'implementazione delle relazioni di ricorrenza in modo semplice e affidabile. C # non può esprimere questo neanche.

  • I problemi matematici richiedono spesso l'uso di strutture e algoritmi di dati più sofisticati. Esprimere soluzioni complicate è molto più semplice con F # rispetto a C #.

Se desideri un case study, ho convertito un'implementazione della decomposizione QR System.Double da 2kLOC di C #. L'F # era solo 100 linee di codice, corre oltre 10 volte più veloce ed è generalizzata sul tipo di numero in modo che funzioni non solo su float32, float e System.Numerics.Complex ma può anche essere applicato a matrici simboliche per ottenere risultati simbolici!

FWIW, I scrivere libri su questo argomento, nonché software commerciale.


18
2018-02-14 00:09



F # supporta unità di misura, che può essere molto utile per il lavoro di matematica.


13
2017-12-24 13:51



Vengo da un background di matematica, e ho guardato F #, ma preferisco comunque C # per la maggior parte degli scopi. Ci sono un paio di cose che F # rende più facile, ma in generale preferisco ancora C # con un ampio margine.

Alcuni dei benefici propagandati di F # (immutabilità, funzioni di ordine superiore, ecc.) Possono ancora essere fatti in C # (usando delegati ecc. Per quest'ultimo). Ciò è ancora più evidente quando si usa C # 3.0 con il supporto lambda, il che rende molto facile ed espressivo dichiarare il codice funzionale.

Da un angolo di manutenzione, sono del parere che le proprietà nominate in modo appropriato ecc siano più facili da usare (su un ciclo di vita completo) rispetto alle tuple e agli elenchi testa / coda, ma potrebbe essere solo io.

Una delle aree in cui C # si lascia andare per la matematica è nei generici e il loro supporto per gli operatori. Quindi passo un po 'di tempo ad affrontare questo ;-p I miei risultati sono disponibili in MiscUtil, con panoramica Qui.


7
2017-12-19 08:34



Sembra che questo post potrebbe essere pertinente: http://fsharpnews.blogspot.com/2007/05/ffts-again.html

Anche: Confronto delle prestazioni C # / F #

Il più grande vantaggio per la matematica pura è quello che dice PerpetualCoder, F # sembra più un problema di matematica, quindi sarà più facile per un matematico scrivere. Mi ha ricordato molto MATLAB quando l'ho guardato.


4
2017-12-19 00:00



Non sono sicuro che sia meglio o peggio, ma c'è sicuramente una differenza nell'approccio. Le lingue statiche specificano in che modo un problema verrà risolto. I linguaggi funzionali come F # o Haskell non lo fanno e sono più personalizzati su come un matematico risolverebbe un problema particolare. Allora hai libri come Questo che tout python è bravo a farlo. Se parli dal punto di vista delle prestazioni, niente può battere C. Se parli da biblioteche, credo che Functional Langauges (F # e simili), Fortan (sì, non è ancora morto), Python ha eccellenti librerie per la matematica.


1
2017-12-18 23:50



Uno dei grandi vantaggi dei linguaggi funzionali è il fatto che possono essere eseguiti su sistemi multi-processore o multi-core, in parallelo senza richiedere la modifica di alcun codice. Ciò significa che puoi accelerare i tuoi algoritmi semplicemente aggiungendo core.


-3
2017-12-19 08:39