Ho scritto una domanda per bilanciare il programma nazionale di generazione di energia per un portafoglio di centrali elettriche con una posizione commerciale per una compagnia energetica. I componenti client e server erano in C # ma il motore di calcolo era scritto in F #.
L'uso di F # per affrontare la complessità alla base di questa applicazione dimostra chiaramente un punto debole per il linguaggio all'interno del software aziendale, ovvero l'analisi algoritmicamente complessa di grandi set di dati. La mia esperienza è stata molto positiva. In particolare:
Unità di misura L'industria in cui lavoro è disseminata di unità. Le equazioni che ho implementato (spesso di natura geometrica) hanno trattato di unità di tempo, potere ed energia. Fare in modo che il sistema di tipi verifichi la correttezza delle unità degli ingressi e delle uscite delle funzioni fa risparmiare molto tempo, sia in termini di test che di lettura / comprensione del codice. Sradica un'intera classe di errori a cui erano soggetti i sistemi precedenti.
Programmazione esplorativa Lavorare con i file di script e REPL (F # Interactive) mi ha permesso di esplorare lo spazio della soluzione in modo più efficace prima di impegnarmi in un'implementazione rispetto al più tradizionale ciclo di modifica / compilazione / esecuzione / test. È un modo molto naturale per un programmatore di costruire la propria comprensione del problema e delle tensioni progettuali in gioco.
Test unitario Il codice scritto usando funzioni che non hanno effetti collaterali e strutture di dati immutabili è una gioia da testare. Non ci sono interazioni complesse dipendenti dal tempo per rovinare le cose o grandi insiemi di dipendenze da deridere.
Interoperabilità Ho definito l'interfaccia per il motore di calcolo in C # e implementato il calcolo in F #. Il motore di calcolo potrebbe quindi essere iniettato in qualsiasi modulo C # che necessitasse di utilizzarlo senza alcun problema di interoperabilità. Senza soluzione di continuità. Il programmatore C # non deve mai saperlo.
Riduzione del codice Gran parte dei dati immessi nel motore di calcolo era in forma di vettori e matrici. Le funzioni di ordine superiore le consumano a colazione con un minimo sforzo, un codice minimo. Bellissimo.
Mancanza di bug La programmazione funzionale può sembrare strana. Posso lavorare su un algoritmo, provando a fare in modo che il codice passi il controllo del tipo ma una volta che il controllo del tipo è soddisfatto, funziona. È quasi binario, non compilerà o sarà corretto. Gli errori dei casi con bordi strani sono ridotti al minimo, la ricorsione e le funzioni di ordine superiore rimuovono molto codice di contabilità che introduce errori nel caso con bordi.
Parallelismo La purezza funzionale dell'implementazione risultante la rende matura per lo sfruttamento del parallelismo intrinseco nell'elaborazione dei vettori di dati. Forse è qui che andrò dopo ora che .NET 4 è uscito.